aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-10-26 09:57:12 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-10-26 09:57:12 +0000
commit9b70c6b0780bc6fef0278d6af9f551bc3f21eaa3 (patch)
tree44b22f7e160c56bcbc8fe0039d6d3e5d27360cde
parent0f095169ae3d48e1e7363625a529fccc458c02a7 (diff)
downloadgcc-9b70c6b0780bc6fef0278d6af9f551bc3f21eaa3.zip
gcc-9b70c6b0780bc6fef0278d6af9f551bc3f21eaa3.tar.gz
gcc-9b70c6b0780bc6fef0278d6af9f551bc3f21eaa3.tar.bz2
re PR c++/31747 (ICE combining static and extern)
cp/ 2007-10-26 Paolo Carlini <pcarlini@suse.de> PR c++/31747 * decl.c (grokdeclarator): In case of conflicting specifiers just return error_mark_node. testsuite/ 2007-10-26 Paolo Carlini <pcarlini@suse.de> PR c++/31747 * g++.dg/parse/crash39.C: New. From-SVN: r129647
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/crash39.C3
4 files changed, 24 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b4edd88..e345e75 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-26 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/31747
+ * decl.c (grokdeclarator): In case of conflicting specifiers
+ just return error_mark_node.
+
2007-10-26 Ollie Wild <aaw@google.com>
* expr.c (cxx_expand_expr): Removed.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 136c8df..9bab97b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7552,6 +7552,12 @@ grokdeclarator (const cp_declarator *declarator,
return error_mark_node;
}
+ if (declspecs->conflicting_specifiers_p)
+ {
+ error ("conflicting specifiers in declaration of %qs", name);
+ return error_mark_node;
+ }
+
/* Extract the basic type from the decl-specifier-seq. */
type = declspecs->type;
if (type == error_mark_node)
@@ -7846,15 +7852,10 @@ grokdeclarator (const cp_declarator *declarator,
error ("multiple storage classes in declaration of %qs", name);
thread_p = false;
}
- if (declspecs->conflicting_specifiers_p)
- {
- error ("conflicting specifiers in declaration of %qs", name);
- storage_class = sc_none;
- }
- else if (decl_context != NORMAL
- && ((storage_class != sc_none
- && storage_class != sc_mutable)
- || thread_p))
+ if (decl_context != NORMAL
+ && ((storage_class != sc_none
+ && storage_class != sc_mutable)
+ || thread_p))
{
if ((decl_context == PARM || decl_context == CATCHPARM)
&& (storage_class == sc_register
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9223aa4..17252b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-26 Paolo Carlini <pcarlini@suse.de>
+
+ PR c++/31747
+ * g++.dg/parse/crash39.C: New.
+
2007-10-26 Uros Bizjak <ubizjak@gmail.com>
* g++.dg/tree-ssa/ivopts-1.C: Remove xfail on the search for
diff --git a/gcc/testsuite/g++.dg/parse/crash39.C b/gcc/testsuite/g++.dg/parse/crash39.C
new file mode 100644
index 0000000..2f39c10
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash39.C
@@ -0,0 +1,3 @@
+// PR c++/31747
+
+static extern int i; // { dg-error "conflicting specifiers" }