decl.c (check_var_type): Add location_t parameter and use it.
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 29 Aug 2019 09:01:26 +0000 (09:01 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 29 Aug 2019 09:01:26 +0000 (09:01 +0000)
/cp
2019-08-29  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (check_var_type): Add location_t parameter and use it.
(grokdeclarator): Adjust call.
* pt.c (tsubst_decl): Likewise.
* cp-tree.h: Adjust declaration.

/testsuite
2019-08-29  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/spellcheck-typenames.C: Adjust expected locations.
* g++.dg/cpp0x/pr84676.C: Check locations.
* g++.dg/other/pr88187.C: Likewise.
* g++.dg/parse/crash13.C: Likewise.
* g++.dg/parse/crash46.C: Likewise.
* g++.dg/parse/template28.C: Likewise.
* g++.dg/parse/typename4.C: Likewise.

From-SVN: r275025

12 files changed:
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr84676.C
gcc/testsuite/g++.dg/other/pr88187.C
gcc/testsuite/g++.dg/parse/crash13.C
gcc/testsuite/g++.dg/parse/crash46.C
gcc/testsuite/g++.dg/parse/template28.C
gcc/testsuite/g++.dg/parse/typename4.C
gcc/testsuite/g++.dg/spellcheck-typenames.C

index 818d32b29d336d622c621d5f14c192668ac2d9f5..37de3d918709b2577d00d8b374b6f02c1fe471a7 100644 (file)
@@ -1,3 +1,10 @@
+2019-08-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (check_var_type): Add location_t parameter and use it.
+       (grokdeclarator): Adjust call.
+       * pt.c (tsubst_decl): Likewise.
+       * cp-tree.h: Adjust declaration.
+
 2019-08-28  Marek Polacek  <polacek@redhat.com>
 
        Implement P1152R4: Deprecating some uses of volatile.
index 0e514d5cc221163c2472a8f73934a50fd77af0eb..3c69e54c8858a2bdeb84ef9e0ca549a60072f0c1 100644 (file)
@@ -6478,7 +6478,7 @@ extern tree cxx_comdat_group                      (tree);
 extern bool cp_missing_noreturn_ok_p           (tree);
 extern bool is_direct_enum_init                        (tree, tree);
 extern void initialize_artificial_var          (tree, vec<constructor_elt, va_gc> *);
-extern tree check_var_type                     (tree, tree);
+extern tree check_var_type                     (tree, tree, location_t);
 extern tree reshape_init                        (tree, tree, tsubst_flags_t);
 extern tree next_initializable_field (tree);
 extern tree fndecl_declared_return_type                (tree);
index 2aef330455f8d2e3d4044ddb4f29417f869e3f23..3497874cb8172e6323cba6355767b83881a51c8d 100644 (file)
@@ -10298,19 +10298,20 @@ check_special_function_return_type (special_function_kind sfk,
    error-recovery purposes.  */
 
 tree
-check_var_type (tree identifier, tree type)
+check_var_type (tree identifier, tree type, location_t loc)
 {
   if (VOID_TYPE_P (type))
     {
       if (!identifier)
-       error ("unnamed variable or field declared void");
+       error_at (loc, "unnamed variable or field declared void");
       else if (identifier_p (identifier))
        {
          gcc_assert (!IDENTIFIER_ANY_OP_P (identifier));
-         error ("variable or field %qE declared void", identifier);
+         error_at (loc, "variable or field %qE declared void",
+                   identifier);
        }
       else
-       error ("variable or field declared void");
+       error_at (loc, "variable or field declared void");
       type = error_mark_node;
     }
 
@@ -12470,7 +12471,7 @@ grokdeclarator (const cp_declarator *declarator,
      error message later.  */
   if (decl_context != PARM)
     {
-      type = check_var_type (unqualified_id, type);
+      type = check_var_type (unqualified_id, type, id_loc);
       if (type == error_mark_node)
         return error_mark_node;
     }
index 54d36f91ddccd84cfc40c40f800f6d150aaa5c58..13d3db9a0f7bad9bd00f45b289a88bc240839271 100644 (file)
@@ -13894,8 +13894,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
            /* Wait until cp_finish_decl to set this again, to handle
               circular dependency (template/instantiate6.C). */
            DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r) = 0;
-           type = check_var_type (DECL_NAME (r), type);
-
+           type = check_var_type (DECL_NAME (r), type,
+                                  DECL_SOURCE_LOCATION (r));
            if (DECL_HAS_VALUE_EXPR_P (t))
              {
                tree ve = DECL_VALUE_EXPR (t);
index 3a4f36e167caadb0df7fd6f2bed79c329e31d7ec..a051dda738e3fbffa2a0761bbbdfd210b590b8fd 100644 (file)
@@ -1,3 +1,13 @@
+2019-08-29  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/spellcheck-typenames.C: Adjust expected locations.
+       * g++.dg/cpp0x/pr84676.C: Check locations.
+       * g++.dg/other/pr88187.C: Likewise.
+       * g++.dg/parse/crash13.C: Likewise.
+       * g++.dg/parse/crash46.C: Likewise.
+       * g++.dg/parse/template28.C: Likewise.
+       * g++.dg/parse/typename4.C: Likewise.
+
 2019-08-29  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/91568
index 94d86716649c7adc4c84240ebda91b1333127b3c..0bd8cc00c2c787acfbdf892c4b165748e8535726 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do compile { target c++11 } }
 
 int a;
-void b(__attribute__((c([](int *) {} (a == (0 = auto))))));  // { dg-error "" }
+void b(__attribute__((c([](int *) {} (a == (0 = auto))))));  // { dg-error "6:variable or field .b. declared void" }
+// { dg-error "expected" "" { target c++11 } .-1 }
index 17c14f4e55248e2f67a62c8dacdf4231620f1941..ebdafddc634f5539713b96b7ed283762151d8586 100644 (file)
@@ -2,6 +2,6 @@
 // { dg-do compile }
 
 template <int> struct A;
-void f (A ()); // { dg-error "variable or field 'f' declared void" "" { target c++14_down } }
+void f (A ()); // { dg-error "6:variable or field 'f' declared void" "" { target c++14_down } }
                // { dg-error "missing template arguments before '\\(' token" "" { target c++14_down } .-1 }
                // { dg-error "'auto' parameter not permitted in this context" "" { target c++17 } .-2 }
index 3c298ec8ede58f767d05e6a6eeabcd40ddd8a6bd..ab6401133cb89e40661810564a11d76f7aa0b1ff 100644 (file)
@@ -12,7 +12,8 @@ struct A
 };
 
 template <typename T> 
-void func(A<T>::B* )   // { dg-error "variable|template|expression" }
+void func(A<T>::B* )   // { dg-error "6:variable or field .func. declared void" }
+// { dg-error "expected" "" { target *-*-* } .-1 }
 {
 }
 
index 0ae22480fde9a59357481f3def6bdd114b5e2942..cb60ad2683e83534b9e6a5a2c30bf7eb1339483a 100644 (file)
@@ -2,17 +2,17 @@
 // { dg-do compile }
 
 void
-foo (_Decimal32)       // { dg-error "declared void" "declared" }
+foo (_Decimal32)       // { dg-error "1:variable or field .foo. declared void" "declared" }
 {
 }
                        // { dg-error "was not declared" "not" { target *-*-* } 5 }
 void
-bar (_Bool)            // { dg-error "declared void" "declared" }
+bar (_Bool)            // { dg-error "1:variable or field .bar. declared void" "declared" }
 {
 }
                        // { dg-error "was not declared" "not" { target *-*-* } 10 }
 void
-baz (_Fract)           // { dg-error "declared void" "declared" }
+baz (_Fract)           // { dg-error "1:variable or field .baz. declared void" "declared" }
 {
 }
                        // { dg-error "was not declared" "not" { target *-*-* } 15 }
index 6868bc8528534c8c4b4d556355edec482898b2be..bfd8af17b670488be892feba33bf68f6767dbea1 100644 (file)
@@ -2,7 +2,8 @@
 
 template<class> struct A {};
 
-template<class T> void foo(A<T>=A<T>()) {} // { dg-error "" }
+template<class T> void foo(A<T>=A<T>()) {} // { dg-error "24:variable or field .foo. declared void" }
+// { dg-error "template" "" { target *-*-* } .-1 }
 
 void bar()
 {
index 529889df60c92da20464dbdca32798272e4b0675..94ab98f45ff9a8931b10b44372a0af4b29117937 100644 (file)
@@ -4,4 +4,5 @@
 
 // PR c++/9364: ICE processing typename with name error.
 
-void find(typename int&); // { dg-error "typename|void|expected" }
+void find(typename int&); // { dg-error "6:variable or field .find. declared void" }
+// { dg-error "expected" "" { target *-*-* } .-1 }
index 25d3f1dcefd8eb322a392f1e7721640e383e00bd..6adf724a3b799df9a9ab0c29e2f62b30086afdea 100644 (file)
@@ -4,10 +4,10 @@
 void test_1 (signed char e);
 
 /* PR c/70339.  */
-void test_2 (singed char e); // { dg-error "21: variable or field 'test_2' declared void" }
+void test_2 (singed char e); // { dg-error "6: variable or field 'test_2' declared void" }
 /* { dg-begin-multiline-output "" }
  void test_2 (singed char e);
-                     ^~~~
+      ^~~~~~
    { dg-end-multiline-output "" } */
 // { dg-message "14: 'singed' was not declared in this scope; did you mean 'signed'\\?" "" { target *-*-* } 7 }
 /* { dg-begin-multiline-output "" }
@@ -16,10 +16,10 @@ void test_2 (singed char e); // { dg-error "21: variable or field 'test_2' decla
               signed
    { dg-end-multiline-output "" } */
 
-void test_3 (car e); // { dg-error "14: variable or field 'test_3' declared void" }
+void test_3 (car e); // { dg-error "6: variable or field 'test_3' declared void" }
 /* { dg-begin-multiline-output "" }
  void test_3 (car e);
-              ^~~
+      ^~~~~~
    { dg-end-multiline-output "" } */
 // { dg-message "14: 'car' was not declared in this scope; did you mean 'char'\\?" "" { target *-*-* } 19 }
 /* { dg-begin-multiline-output "" }