aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-05-03 00:19:40 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-05-03 00:19:40 +0000
commitcc3281454ebde12095f02b55902a6aa44efee100 (patch)
treed52890f371966bbc7c877ce570e317a009e69c06 /gcc
parentdb40f6d4a1a19e3337e1ef87ae3edcdd2610072f (diff)
downloadgcc-cc3281454ebde12095f02b55902a6aa44efee100.zip
gcc-cc3281454ebde12095f02b55902a6aa44efee100.tar.gz
gcc-cc3281454ebde12095f02b55902a6aa44efee100.tar.bz2
re PR c++/27102 (ICE with invalid class name in function template)
PR c++/27102 * decl.c (grokdeclarator): Robustify checks for defining members of incomplete types. PR c++/27102 * g++.dg/template/crash49.C: New test. From-SVN: r113492
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/crash49.C4
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" }