OSDN Git Service

PR c++/6492
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2002 14:56:24 +0000 (14:56 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2002 14:56:24 +0000 (14:56 +0000)
* pt.c (tsubst_friend_class): If the friend has an explicit scope,
enter that scope before name lookup.

PR c++/6486
* method.c (do_build_copy_constructor): Avoid building
cv-qualified reference types.

PR c++/6486
* g++.dg/template/friend6.C: New test.

PR c++/6492
* g++.dg/init/copy1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52895 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/copy1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/friend6.C [new file with mode: 0644]

index e076a34..9ad6e11 100644 (file)
@@ -1,3 +1,13 @@
+2002-04-29  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/6492
+       * pt.c (tsubst_friend_class): If the friend has an explicit scope,
+       enter that scope before name lookup.
+
+       PR c++/6486
+       * method.c (do_build_copy_constructor): Avoid building
+       cv-qualified reference types.
+  
 2002-04-29  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/5719
index b689067..b74bd28 100644 (file)
@@ -562,6 +562,7 @@ do_build_copy_constructor (fndecl)
        {
          tree init;
          tree field = fields;
+         tree expr_type;
 
          if (TREE_CODE (field) != FIELD_DECL)
            continue;
@@ -584,9 +585,15 @@ do_build_copy_constructor (fndecl)
          else
            continue;
 
-         init = build (COMPONENT_REF,
-                       cp_build_qualified_type (TREE_TYPE (field), cvquals),
-                       init, field);
+         /* Compute the type of "init->field".  If the copy-constructor
+            parameter is, for example, "const S&", and the type of
+            the field is "T", then the type will usually be "const
+            T".  (There are no cv-qualified variants of reference
+            types.)  */
+         expr_type = TREE_TYPE (field);
+         if (TREE_CODE (expr_type) != REFERENCE_TYPE)
+           expr_type = cp_build_qualified_type (expr_type, cvquals);
+         init = build (COMPONENT_REF, expr_type, init, field);
          init = build_tree_list (NULL_TREE, init);
 
          member_init_list
index 0024a92..722263a 100644 (file)
@@ -1,3 +1,11 @@
+2002-04-29  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/6486
+       * g++.dg/template/friend6.C: New test.
+
+       PR c++/6492
+       * g++.dg/init/copy1.C: New test.
+
 2002-04-29  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.dg/warn/effc1.C: New test.
diff --git a/gcc/testsuite/g++.dg/init/copy1.C b/gcc/testsuite/g++.dg/init/copy1.C
new file mode 100644 (file)
index 0000000..91a84ae
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+class A {
+public:
+    A(){}
+    A( const A& a ){}
+};
+
+class B  : public A
+{
+public:
+  B( int& s) : s_(s){}
+  int& s_;
+};
+
+int main()
+{
+  int i;
+  B x1( i );
+  B x2( x1 );
+}
diff --git a/gcc/testsuite/g++.dg/template/friend6.C b/gcc/testsuite/g++.dg/template/friend6.C
new file mode 100644 (file)
index 0000000..e330d98
--- /dev/null
@@ -0,0 +1,53 @@
+// { dg-do compile }
+
+namespace boost_no_member_template_friends{
+
+template <class T>
+class foobar;
+
+template <class T>
+class foo
+{
+private:
+   template<typename Y> friend class foobar;
+   template<typename Y> friend class foo;
+   template<typename Y> friend bool must_be_friend_proc(const foo<Y>& f);
+   int i;
+public:
+   foo(){ i = 0; }
+   template <class U>
+   foo(const foo<U>& f){ i = f.i; }
+};
+
+template <class T>
+class foo;
+
+template <class T>
+bool must_be_friend_proc(const foo<T>& f);
+
+template <class T>
+bool must_be_friend_proc(const foo<T>& f)
+{ return f.i != 0; }
+
+template <class T>
+class foobar
+{
+   int i;
+public:
+   template <class U>
+   foobar(const foo<U>& f)
+   { i = f.i; }
+};
+
+
+int test()
+{
+   foo<int> fi;
+   foo<double> fd(fi);
+   (void) &fd;           // avoid "unused variable" warning
+   foobar<long> fb(fi);
+   (void) &fb;           // avoid "unused variable" warning
+   return 0;
+}
+
+}