aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2002-04-29 14:56:24 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2002-04-29 14:56:24 +0000
commit33dd07ee9d7fe8fb3ff9c0391bc6891c2fbd1b90 (patch)
treebbfde17f6dfa4ed7c3ba43768c8a5d0cfd5fb3f8 /gcc
parentd5482cdcb03e1da0d673ebac860cc77034026ac2 (diff)
downloadgcc-33dd07ee9d7fe8fb3ff9c0391bc6891c2fbd1b90.zip
gcc-33dd07ee9d7fe8fb3ff9c0391bc6891c2fbd1b90.tar.gz
gcc-33dd07ee9d7fe8fb3ff9c0391bc6891c2fbd1b90.tar.bz2
re PR c++/6492 (New boost regression (friends))
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. PR c++/6486 * g++.dg/template/friend6.C: New test. PR c++/6492 * g++.dg/init/copy1.C: New test. From-SVN: r52895
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/method.c13
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/init/copy1.C21
-rw-r--r--gcc/testsuite/g++.dg/template/friend6.C53
5 files changed, 102 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e076a34..9ad6e11 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index b689067..b74bd28 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0024a92..722263a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..91a84ae
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/copy1.C
@@ -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
index 0000000..e330d98
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/friend6.C
@@ -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;
+}
+
+}