DR 180
	* decl.c (grokdeclarator): Require class-key for all friend class.
	Output the correct type and context in the error message.

	* g++.old-deja/g++.pt/crash32.C: Expect error.

From-SVN: r59719
This commit is contained in:
Kriang Lerdsuwanakij 2002-12-02 17:03:13 +00:00 committed by Kriang Lerdsuwanakij
parent 513f31eb68
commit 218e0eb6d3
4 changed files with 21 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2002-12-02 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
DR 180
* decl.c (grokdeclarator): Require class-key for all friend class.
Output the correct type and context in the error message.
2002-12-01 Mark Mitchell <mark@codesourcery.com>
PR c++/5919

View File

@ -11645,22 +11645,19 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
inlinep = 0;
}
/* Until core issue 180 is resolved, allow 'friend typename A::B'.
But don't allow implicit typenames except with a class-key. */
if (!current_aggr && (TREE_CODE (type) != TYPENAME_TYPE
|| IMPLICIT_TYPENAME_P (type)))
if (!current_aggr)
{
/* Don't allow friend declaration without a class-key. */
if (TREE_CODE (type) == TEMPLATE_TYPE_PARM)
pedwarn ("template parameters cannot be friends");
pedwarn ("template parameters cannot be friends");
else if (TREE_CODE (type) == TYPENAME_TYPE)
pedwarn ("\
friend declaration requires class-key, i.e. `friend class %T::%T'",
constructor_name (current_class_type),
TYPE_IDENTIFIER (type));
pedwarn ("friend declaration requires class-key, "
"i.e. `friend class %T::%D'",
TYPE_CONTEXT (type), TYPENAME_TYPE_FULLNAME (type));
else
pedwarn ("\
friend declaration requires class-key, i.e. `friend %#T'",
type);
pedwarn ("friend declaration requires class-key, "
"i.e. `friend %#T'",
type);
}
/* Only try to do this stuff if we didn't already give up. */

View File

@ -1,3 +1,8 @@
2002-12-02 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
DR 180
* g++.old-deja/g++.pt/crash32.C: Expect error.
2002-12-01 Mark Mitchell <mark@codesourcery.com>
PR c++/5919

View File

@ -8,6 +8,6 @@ template <class T> struct A
template<class T> struct C
{
friend typename A<T>::B;
friend typename A<T>::B; // ERROR - struct is required
};