]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60361 (unexpected 'use of parameter outside function body' error)
authorJason Merrill <jason@redhat.com>
Wed, 5 Mar 2014 17:53:28 +0000 (12:53 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 5 Mar 2014 17:53:28 +0000 (12:53 -0500)
PR c++/60361
* parser.c (cp_parser_template_id): Don't set up a CPP_TEMPLATE_ID
if re-parsing might succeed.
* semantics.c (finish_id_expression): Use of a parameter outside
the function body is a parse error.

From-SVN: r208351

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/parse/ambig7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
gcc/testsuite/g++.dg/parse/typename7.C

index 379ac736ed17209cd938390cb1eeeeda83af9def..9e7b9b77c9cd3ed065c269f1673ae794ef7d2be8 100644 (file)
@@ -1,5 +1,11 @@
 2014-03-05  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60361
+       * parser.c (cp_parser_template_id): Don't set up a CPP_TEMPLATE_ID
+       if re-parsing might succeed.
+       * semantics.c (finish_id_expression): Use of a parameter outside
+       the function body is a parse error.
+
        * parser.c (cp_parser_mem_initializer): Set input_location
        properly for init-list warning.
        (cp_parser_postfix_open_square_expression): Likewise.
index 5b3e48951acfd75a448399363f212b7f407560e4..b56870d62255116fa71a1d80e260ac5f778be787 100644 (file)
@@ -13466,7 +13466,12 @@ cp_parser_template_id (cp_parser *parser,
      the effort required to do the parse, nor will we issue duplicate
      error messages about problems during instantiation of the
      template.  */
-  if (start_of_id)
+  if (start_of_id
+      /* Don't do this if we had a parse error in a declarator; re-parsing
+        might succeed if a name changes meaning (60361).  */
+      && !(cp_parser_error_occurred (parser)
+          && cp_parser_parsing_tentatively (parser)
+          && parser->in_declarator_p))
     {
       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
 
index 787eab81a64facd3467462f31cdf59050bb64a66..4081e0ec1d577339e668e82da787c5a7ccf1c5f2 100644 (file)
@@ -3246,7 +3246,7 @@ finish_id_expression (tree id_expression,
          && DECL_CONTEXT (decl) == NULL_TREE
          && !cp_unevaluated_operand)
        {
-         error ("use of parameter %qD outside function body", decl);
+         *error_msg = "use of parameter outside function body";
          return error_mark_node;
        }
     }
diff --git a/gcc/testsuite/g++.dg/parse/ambig7.C b/gcc/testsuite/g++.dg/parse/ambig7.C
new file mode 100644 (file)
index 0000000..9a5b879
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/60361
+
+struct Helper
+{
+  Helper(int a, void (*pfunc)());
+};
+
+template <int I> void function();
+
+const int A = 1;
+const int B = 2;
+
+Helper testOk(A, function<A>);
+Helper testOk2(int(A), function<B>);
+Helper testOk3((int(A)), function<A>);
+Helper testFail(int(A), function<A>);
index 6116630433f3d5c825258f68f74842c4e967047f..3c983cc748c4cc0d7409085834e67f734b414159 100644 (file)
@@ -1,2 +1,2 @@
-void f (int i, int p[i]); // { dg-error "use of parameter .i. outside function body" }
+void f (int i, int p[i]); // { dg-error "use of parameter.*outside function body" }
 // { dg-prune-output "array bound" }
index 6ec76961013c436fc7906c7afa882edc0aa0959d..e49a1ec393520dbdeb6a803dbf79fd008e571162 100644 (file)
@@ -7,10 +7,9 @@
 
 struct A
 {
-  template<typename>   void foo(int); // { dg-message "note" }
-  template<typename T> void bar(T t) { // { dg-message "note" }
+  template<typename>   void foo(int);
+  template<typename T> void bar(T t) {
     this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
-  // { dg-message "candidate" "candidate note" { target *-*-* } 12 }
   template<typename T> void bad(T t) {
     foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
 };
@@ -20,7 +19,6 @@ struct B
 {
   void bar(T t) {
     A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
-  // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
   void bad(T t) {
     B<typename T>::bar(t); } // { dg-error "invalid|qualified-id|not a template" }
 };