Hi,

one more, rather straightforward, simply use the location stored in the declarator. Tested x86_64-linux.

Thanks, Paolo.

////////////////////

/cp
2019-05-23  Paolo Carlini  <paolo.carl...@oracle.com>

        * decl.c (grokdeclarator): Use declarator->id_loc in five error
        error_at calls.

/testsuite
2019-05-23  Paolo Carlini  <paolo.carl...@oracle.com>

        * g++.dg/cpp0x/alias-decl-18.C: Test location too.
        * g++.dg/cpp0x/udlit-nofunc-neg.C: Likewise.
        * g++.dg/parse/crash59.C: Likewise.
        * g++.dg/parse/error38.C: Likewise.
        * g++.dg/parse/error39.C: Likewise.
        * g++.dg/template/crash31.C: Likewise.
        * g++.dg/template/operator8.C: Likewise.
        * g++.dg/template/operator9.C: Likewise.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 271542)
+++ cp/decl.c   (working copy)
@@ -10592,7 +10592,8 @@ grokdeclarator (const cp_declarator *declarator,
      D1 ( parameter-declaration-clause) ...  */
   if (funcdef_flag && innermost_code != cdk_function)
     {
-      error ("function definition does not declare parameters");
+      error_at (declarator->id_loc,
+               "function definition does not declare parameters");
       return error_mark_node;
     }
 
@@ -10600,7 +10601,8 @@ grokdeclarator (const cp_declarator *declarator,
       && innermost_code != cdk_function
       && ! (ctype && !declspecs->any_specifiers_p))
     {
-      error ("declaration of %qD as non-function", dname);
+      error_at (declarator->id_loc,
+               "declaration of %qD as non-function", dname);
       return error_mark_node;
     }
 
@@ -10609,7 +10611,8 @@ grokdeclarator (const cp_declarator *declarator,
       if (UDLIT_OPER_P (dname)
          && innermost_code != cdk_function)
        {
-         error ("declaration of %qD as non-function", dname);
+         error_at (declarator->id_loc,
+                   "declaration of %qD as non-function", dname);
          return error_mark_node;
        }
 
@@ -10617,12 +10620,14 @@ grokdeclarator (const cp_declarator *declarator,
        {
          if (typedef_p)
            {
-             error ("declaration of %qD as %<typedef%>", dname);
+             error_at (declarator->id_loc,
+                       "declaration of %qD as %<typedef%>", dname);
              return error_mark_node;
            }
          else if (decl_context == PARM || decl_context == CATCHPARM)
            {
-             error ("declaration of %qD as parameter", dname);
+             error_at (declarator->id_loc,
+                       "declaration of %qD as parameter", dname);
              return error_mark_node;
            }
        }
Index: testsuite/g++.dg/cpp0x/alias-decl-18.C
===================================================================
--- testsuite/g++.dg/cpp0x/alias-decl-18.C      (revision 271542)
+++ testsuite/g++.dg/cpp0x/alias-decl-18.C      (working copy)
@@ -5,5 +5,6 @@ template<typename Z> using ::T = void(int n); // {
 template<typename Z> using operator int = void(int n); // { dg-error "" }
 template<typename Z> using typename U = void; // { dg-error "" }
 template<typename Z> using typename ::V = void(int n); // { dg-error "" }
-template<typename Z> using typename ::operator bool = void(int n); // { 
dg-error "" }
+template<typename Z> using typename ::operator bool = void(int n); // { 
dg-error "39:declaration" }
+// { dg-error "expected" "" { target *-*-* } .-1 }
 using foo __attribute__((aligned(4)) = int; // { dg-error "" }
Index: testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
===================================================================
--- testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C   (revision 271542)
+++ testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C   (working copy)
@@ -3,7 +3,7 @@
 // Test user-defined literals.
 // Test error on non-function declaration.
 
-double operator"" _baddecl; // { dg-error "as non-function" }
+double operator"" _baddecl; // { dg-error "8:declaration of 
.operator\"\"_baddecl. as non-function" }
 
 template<char...>
-  int operator"" _badtmpldecl; // { dg-error "as non-function" }
+  int operator"" _badtmpldecl; // { dg-error "7:declaration of 
.operator\"\"_badtmpldecl. as non-function" }
Index: testsuite/g++.dg/parse/crash59.C
===================================================================
--- testsuite/g++.dg/parse/crash59.C    (revision 271542)
+++ testsuite/g++.dg/parse/crash59.C    (working copy)
@@ -1,3 +1,4 @@
 // PR c++/53003
 
-struct A{ void a{} return b  // { dg-error "function definition|expected" }
+struct A{ void a{} return b  // { dg-error "16:function definition" }
+// { dg-error "expected" "" { target *-*-* } .-1 }
Index: testsuite/g++.dg/parse/error38.C
===================================================================
--- testsuite/g++.dg/parse/error38.C    (revision 271542)
+++ testsuite/g++.dg/parse/error38.C    (working copy)
@@ -1,3 +1,3 @@
 // PR c++/29003
 
-typedef int operator !(); // { dg-error "declaration" }
+typedef int operator !(); // { dg-error "13:declaration" }
Index: testsuite/g++.dg/parse/error39.C
===================================================================
--- testsuite/g++.dg/parse/error39.C    (revision 271542)
+++ testsuite/g++.dg/parse/error39.C    (working copy)
@@ -1,6 +1,6 @@
 // PR c++/41769
 
-void f(void operator+()); // { dg-error "declaration" }
+void f(void operator+()); // { dg-error "13:declaration" }
 
 void g()
 {
@@ -8,7 +8,7 @@ void g()
     {
 
     }
-  catch(void operator+()) // { dg-error "declaration" }
+  catch(void operator+()) // { dg-error "14:declaration" }
     {
     }
 }
Index: testsuite/g++.dg/template/crash31.C
===================================================================
--- testsuite/g++.dg/template/crash31.C (revision 271542)
+++ testsuite/g++.dg/template/crash31.C (working copy)
@@ -1,3 +1,4 @@
 // PR c++/19063
 
-template<operator< struct A {}; // { dg-error "" }
+template<operator< struct A {}; // { dg-error "10:declaration" }
+// { dg-error "expected|extra" "" { target *-*-* } .-1 }
Index: testsuite/g++.dg/template/operator8.C
===================================================================
--- testsuite/g++.dg/template/operator8.C       (revision 271542)
+++ testsuite/g++.dg/template/operator8.C       (working copy)
@@ -2,5 +2,6 @@
 
 struct A
 {
-    template<operator+> void foo() {}   // { dg-error 
"identifier|parameter|template arguments" }
+    template<operator+> void foo() {}   // { dg-error "14:declaration" }
+  // { dg-error "expected|template" "" { target *-*-* } .-1 }
 };
Index: testsuite/g++.dg/template/operator9.C
===================================================================
--- testsuite/g++.dg/template/operator9.C       (revision 271542)
+++ testsuite/g++.dg/template/operator9.C       (working copy)
@@ -1,6 +1,7 @@
 //PR c++/27670
 
-template<operator+> void foo(); // { dg-error "before|parameter|template" }
+template<operator+> void foo(); // { dg-error "10:declaration" }
+// { dg-error "expected|template" "" { target *-*-* } .-1 }
 
 void bar()
 {

Reply via email to