diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-02-02 13:23:18 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-02-02 13:23:18 +0100 |
commit | 3e66d096990519fcf0408a3bfc5b92e7d32b6462 (patch) | |
tree | c51466cf854f17a26d8cffbec0e8ce95194d1e31 /gcc | |
parent | 6b01cd54dd628d5f5b02c508032113d764759141 (diff) | |
download | gcc-3e66d096990519fcf0408a3bfc5b92e7d32b6462.zip gcc-3e66d096990519fcf0408a3bfc5b92e7d32b6462.tar.gz gcc-3e66d096990519fcf0408a3bfc5b92e7d32b6462.tar.bz2 |
re PR c++/30536 (ICE with __thread and register)
PR c++/30536
* decl.c (grokdeclarator): If __thread is used together with
a storage class other than extern and static, clear thread_p
after issuing diagnostics and fall through to checking the
storage class.
* g++.dg/tls/diag-5.C: New test.
From-SVN: r121496
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/decl.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tls/diag-5.C | 5 |
4 files changed, 25 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c89e383..47ac05f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2007-02-02 Jakub Jelinek <jakub@redhat.com> + + PR c++/30536 + * decl.c (grokdeclarator): If __thread is used together with + a storage class other than extern and static, clear thread_p + after issuing diagnostics and fall through to checking the + storage class. + 2007-01-30 Roger Sayle <roger@eyesopen.com> * error.c (dump_type_suffix): Avoid use of cp_build_binary_op when diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index cea649a..a98d902 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7470,20 +7470,20 @@ grokdeclarator (const cp_declarator *declarator, /* Warn about storage classes that are invalid for certain kinds of declarations (parameters, typenames, etc.). */ + if (thread_p + && ((storage_class + && storage_class != sc_extern + && storage_class != sc_static) + || declspecs->specs[(int)ds_typedef])) + { + 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 (thread_p - && ((storage_class - && storage_class != sc_extern - && storage_class != sc_static) - || declspecs->specs[(int)ds_typedef])) - { - error ("multiple storage classes in declaration of %qs", name); - thread_p = false; - } else if (decl_context != NORMAL && ((storage_class != sc_none && storage_class != sc_mutable) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e699db6..1a46168 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-02-02 Jakub Jelinek <jakub@redhat.com> + PR c++/30536 + * g++.dg/tls/diag-5.C: New test. + PR middle-end/30473 * gcc.dg/pr30473.c: New test. * gcc.c-torture/execute/20070201-1.c: New test. diff --git a/gcc/testsuite/g++.dg/tls/diag-5.C b/gcc/testsuite/g++.dg/tls/diag-5.C new file mode 100644 index 0000000..ca92b30 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-5.C @@ -0,0 +1,5 @@ +// PR c++/30536 +// Invalid __thread specifiers. +// { dg-require-effective-target tls } + +struct A { __thread register int i; }; // { dg-error "multiple storage classes|storage class specified" } |