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
This commit is contained in:
Mark Mitchell 2002-04-29 14:56:24 +00:00 committed by Mark Mitchell
parent d5482cdcb0
commit 33dd07ee9d
5 changed files with 102 additions and 3 deletions

View 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

View 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

View 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.

View File

@ -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 );
}

View File

@ -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;
}
}