From 55ebab6e71e04058a222b66fe47dbee192ed34ea Mon Sep 17 00:00:00 2001 From: lerdsuwa Date: Mon, 2 Dec 2002 17:03:13 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59719 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 21 +++++++++------------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.old-deja/g++.pt/crash32.C | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index da4f5977dda..2ade3e38382 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-12-02 Kriang Lerdsuwanakij + + 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 PR c++/5919 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f3ffbf10712..1e26b0f112c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d87d1ec168..4f05e81e694 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-12-02 Kriang Lerdsuwanakij + + DR 180 + * g++.old-deja/g++.pt/crash32.C: Expect error. + 2002-12-01 Mark Mitchell PR c++/5919 diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash32.C b/gcc/testsuite/g++.old-deja/g++.pt/crash32.C index 68cf4df6fb2..af6ef5b95cd 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/crash32.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash32.C @@ -8,6 +8,6 @@ template struct A template struct C { - friend typename A::B; + friend typename A::B; // ERROR - struct is required }; -- 2.11.0