diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 803644d8790..1b8438cb03e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2006-05-02 Mark Mitchell + PR c++/27102 + * decl.c (grokdeclarator): Robustify checks for defining members + of incomplete types. + PR c++/27309 * class.c (add_method): Call grok_special_member_properties. * decl.c (grokdeclarator): Don't call it here. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 40c21205568..057c1fb5169 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7722,12 +7722,19 @@ grokdeclarator (const cp_declarator *declarator, else if (/* If the qualifying type is already complete, then we can skip the following checks. */ !COMPLETE_TYPE_P (ctype) - /* If a function is being defined, then the qualifying - type must be complete. The qualifying type may be - incomplete for a declaration only if the qualifying - type is one of the classes presently being defined, - or if it is a dependent type. */ - && (funcdef_flag + && (/* If the function is being defined, then + qualifying type must certainly be complete. */ + funcdef_flag + /* A friend declaration of "T::f" is OK, even if + "T" is a template parameter. But, if this + function is not a friend, the qualifying type + must be a class. */ + || (!friendp && !CLASS_TYPE_P (ctype)) + /* For a declaration, the type need not be + complete, if either it is dependent (since there + is no meaningful definition of complete in that + case) or the qualifying class is currently being + defined. */ || !(dependent_type_p (ctype) || currently_open_class (ctype))) /* Check that the qualifying type is complete. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07196c89269..a439ad29fd6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-02 Mark Mitchell + + PR c++/27102 + * g++.dg/template/crash49.C: New test. + 2006-05-02 Steve Ellcey PR testsuite/27032 diff --git a/gcc/testsuite/g++.dg/template/crash49.C b/gcc/testsuite/g++.dg/template/crash49.C new file mode 100644 index 00000000000..41fc9be7b22 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash49.C @@ -0,0 +1,4 @@ +// PR c++/27102 + +template +void T::foo; // { dg-error "invalid" }