summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-06-25 04:48:53 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-06-25 04:48:53 +0000
commitc802bb91781cf017dc1dc17f4b80e9113189c03c (patch)
tree47e9d68b420fdc69750338b04b896682933feb34
parentc2740ba8d066f2612f6bc821961ce00857ea29c5 (diff)
downloadgcc-c802bb91781cf017dc1dc17f4b80e9113189c03c.tar.gz
* decl.c (grokdeclarator): Restore error messages about __thread.
* parser.c (cp_parser_decl_specifier_seq): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83636 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c34
-rw-r--r--gcc/cp/parser.c16
3 files changed, 46 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fee6c9a1223..0063722b879 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-24 Mark Mitchell <mark@codesourcery.com>
+
+ * decl.c (grokdeclarator): Restore error messages about __thread.
+ * parser.c (cp_parser_decl_specifier_seq): Likewise.
+
2004-06-24 Jason Merrill <jason@redhat.com>
PR c++/16115
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 2798440816f..5f7fb81ee06 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6545,7 +6545,25 @@ grokdeclarator (const cp_declarator *declarator,
longlong = 1;
}
else if (declspecs->specs[(int)ds] > 1)
- error ("duplicate decl-specifier");
+ {
+ static const char *decl_spec_names[] = {
+ "signed",
+ "unsigned",
+ "short",
+ "long",
+ "const",
+ "volatile",
+ "restrict",
+ "inline",
+ "virtual",
+ "explicit",
+ "friend",
+ "typedef",
+ "__complex",
+ "__thread"
+ };
+ error ("duplicate `%s'", decl_spec_names[(int)ds]);
+ }
}
#if 0
@@ -6796,9 +6814,19 @@ grokdeclarator (const cp_declarator *declarator,
kinds of declarations (parameters, typenames, etc.). */
if (declspecs->multiple_storage_classes_p)
error ("multiple storage classes in declaration of `%s'", name);
+ else if (declspecs->specs[(int)ds_thread]
+ && ((declspecs->storage_class
+ && declspecs->storage_class != sc_extern
+ && declspecs->storage_class != sc_static)
+ || declspecs->specs[(int)ds_typedef]))
+ {
+ error ("multiple storage classes in declaration of `%s'", name);
+ declspecs->specs[(int)ds_thread] = 0;
+ }
else if (decl_context != NORMAL
- && declspecs->storage_class != sc_none
- && declspecs->storage_class != sc_mutable)
+ && ((declspecs->storage_class != sc_none
+ && declspecs->storage_class != sc_mutable)
+ || declspecs->specs[(int)ds_thread]))
{
if ((decl_context == PARM || decl_context == CATCHPARM)
&& (declspecs->storage_class == sc_register
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ffaf0c85c99..346ad1cabcf 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7200,17 +7200,21 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
if (decl_specs->specs[(int) ds_thread])
- error ("`__thread' before `static'");
- else
- cp_parser_set_storage_class (decl_specs, sc_static);
+ {
+ error ("`__thread' before `static'");
+ decl_specs->specs[(int) ds_thread] = 0;
+ }
+ cp_parser_set_storage_class (decl_specs, sc_static);
break;
case RID_EXTERN:
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
if (decl_specs->specs[(int) ds_thread])
- error ("`__thread' before `extern'");
- else
- cp_parser_set_storage_class (decl_specs, sc_extern);
+ {
+ error ("`__thread' before `extern'");
+ decl_specs->specs[(int) ds_thread] = 0;
+ }
+ cp_parser_set_storage_class (decl_specs, sc_extern);
break;
case RID_MUTABLE:
/* Consume the token. */