]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/37877 (Invalid "invalid use of static" error)
authorRichard Guenther <rguenther@suse.de>
Fri, 10 Jul 2009 15:56:52 +0000 (15:56 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 10 Jul 2009 15:56:52 +0000 (15:56 +0000)
2009-07-10  Richard Guenther  <rguenther@suse.de>

Backport from mainline
2009-01-09  John F. Carr  <jfc@mit.edu>

PR c++/37877
* parser.c (cp_parser_class_specifier): Clear
parser->in_unbraced_linkage_specification_p while parsing class
specifiers.

* g++.dg/parse/linkage3.C: New test.

From-SVN: r149485

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/linkage3.C [new file with mode: 0644]

index 7cd01de330162b97965c499856ed5f001e973763..4ae784d171377e08504a0e593ca6bce38aa810b5 100644 (file)
@@ -1,3 +1,13 @@
+2009-07-10  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
+       2009-01-09  John F. Carr  <jfc@mit.edu>
+
+       PR c++/37877
+       * parser.c (cp_parser_class_specifier): Clear
+       parser->in_unbraced_linkage_specification_p while parsing class
+       specifiers.
+
 2009-07-10  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
index d72793a2b96631c8a6c423810b2e1021124ff065..644fd708521c22c65e33188cc8891f26dc95d1c5 100644 (file)
@@ -14207,6 +14207,7 @@ cp_parser_class_specifier (cp_parser* parser)
   bool nested_name_specifier_p;
   unsigned saved_num_template_parameter_lists;
   bool saved_in_function_body;
+  bool saved_in_unbraced_linkage_specification_p;
   tree old_scope = NULL_TREE;
   tree scope = NULL_TREE;
   tree bases;
@@ -14258,6 +14259,10 @@ cp_parser_class_specifier (cp_parser* parser)
   /* We are not in a function body.  */
   saved_in_function_body = parser->in_function_body;
   parser->in_function_body = false;
+  /* We are not immediately inside an extern "lang" block.  */
+  saved_in_unbraced_linkage_specification_p
+    = parser->in_unbraced_linkage_specification_p;
+  parser->in_unbraced_linkage_specification_p = false;
 
   /* Start the class.  */
   if (nested_name_specifier_p)
@@ -14370,6 +14375,8 @@ cp_parser_class_specifier (cp_parser* parser)
   parser->in_function_body = saved_in_function_body;
   parser->num_template_parameter_lists
     = saved_num_template_parameter_lists;
+  parser->in_unbraced_linkage_specification_p
+    = saved_in_unbraced_linkage_specification_p;
 
   return type;
 }
index 250ae1f209e6c628d5c33c73e975db42068bb862..bef72f362331a8032814303519e37174cc4e1647 100644 (file)
@@ -1,3 +1,11 @@
+2009-07-10  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
+       2009-01-09  John F. Carr  <jfc@mit.edu>
+
+       PR c++/37877
+       * g++.dg/parse/linkage3.C: New test.
+
 2009-07-10  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/parse/linkage3.C b/gcc/testsuite/g++.dg/parse/linkage3.C
new file mode 100644 (file)
index 0000000..0d952d1
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/37877
+// { dg-do compile }
+
+extern "C++" struct S
+{
+  static int x;
+} s;