OSDN Git Service

DR 180
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Dec 2002 17:03:13 +0000 (17:03 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Dec 2002 17:03:13 +0000 (17:03 +0000)
* 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.

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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/crash32.C

index da4f597..2ade3e3 100644 (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
index f3ffbf1..1e26b0f 100644 (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.  */
index 0d87d1e..4f05e81 100644 (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
index 68cf4df..af6ef5b 100644 (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
 };