diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/decl.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash49.C | 4 |
4 files changed, 26 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 803644d..1b8438c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2006-05-02 Mark Mitchell <mark@codesourcery.com> + 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 40c2120..057c1fb 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 07196c8..a439ad2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-02 Mark Mitchell <mark@codesourcery.com> + + PR c++/27102 + * g++.dg/template/crash49.C: New test. + 2006-05-02 Steve Ellcey <sje@cup.hp.com> 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 0000000..41fc9be --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash49.C @@ -0,0 +1,4 @@ +// PR c++/27102 + +template <typename T> +void T::foo; // { dg-error "invalid" } |