decl.c (check_tag_decl): Use declspecs->locations as locations in error_at and warnin...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 3 Jun 2015 17:08:39 +0000 (17:08 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 3 Jun 2015 17:08:39 +0000 (17:08 +0000)
/cp
2015-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

* decl.c (check_tag_decl): Use declspecs->locations as locations in
error_at and warning_at calls.

/testsuite
2015-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/cpp0x/decl-loc1.C: New.
* g++.dg/cpp0x/constexpr-neg1.C: Adjust.
* g++.dg/cpp0x/constexpr-object1.C: Likewise.
* g++.dg/init/ctor8.C: Likewise.
* g++.dg/parse/semicolon4.C: Likewise.

From-SVN: r224097

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C
gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C
gcc/testsuite/g++.dg/cpp0x/decl-loc1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/ctor8.C
gcc/testsuite/g++.dg/parse/semicolon4.C

index a4ab191ad8c3487086e66035f530aaefa0ccf24e..2c61d5577162801f8227b55eba1ace317a450924 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * decl.c (check_tag_decl): Use declspecs->locations as locations in
+       error_at and warning_at calls.
+
 2015-06-03  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/66190
index 6140ab6770ae5b783861ea7a3669e3bc55abf5ad..9d20b9487d253dafa4d0d2a4834b527842fd66df 100644 (file)
@@ -4488,30 +4488,46 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
 
   else
     {
-      if (decl_spec_seq_has_spec_p (declspecs, ds_inline)
-         || decl_spec_seq_has_spec_p (declspecs, ds_virtual))
-       error ("%qs can only be specified for functions",
-              decl_spec_seq_has_spec_p (declspecs, ds_inline)
-              ? "inline" : "virtual");
+      if (decl_spec_seq_has_spec_p (declspecs, ds_inline))
+       error_at (declspecs->locations[ds_inline],
+                 "%<inline%> can only be specified for functions");
+      else if (decl_spec_seq_has_spec_p (declspecs, ds_virtual))
+       error_at (declspecs->locations[ds_virtual],
+                 "%<virtual%> can only be specified for functions");
       else if (saw_friend
               && (!current_class_type
                   || current_scope () != current_class_type))
-       error ("%<friend%> can only be specified inside a class");
+       error_at (declspecs->locations[ds_friend],
+                 "%<friend%> can only be specified inside a class");
       else if (decl_spec_seq_has_spec_p (declspecs, ds_explicit))
-       error ("%<explicit%> can only be specified for constructors");
+       error_at (declspecs->locations[ds_explicit],
+                 "%<explicit%> can only be specified for constructors");
       else if (declspecs->storage_class)
-       error ("a storage class can only be specified for objects "
-              "and functions");
-      else if (decl_spec_seq_has_spec_p (declspecs, ds_const)
-              || decl_spec_seq_has_spec_p (declspecs, ds_volatile)
-              || decl_spec_seq_has_spec_p (declspecs, ds_restrict)
-              || decl_spec_seq_has_spec_p (declspecs, ds_thread))
-       error ("qualifiers can only be specified for objects "
-              "and functions");
+       error_at (declspecs->locations[ds_storage_class],
+                 "a storage class can only be specified for objects "
+                 "and functions");
+      else if (decl_spec_seq_has_spec_p (declspecs, ds_const))
+       error_at (declspecs->locations[ds_const],
+                 "%<const%> can only be specified for objects and "
+                 "functions");
+      else if (decl_spec_seq_has_spec_p (declspecs, ds_volatile))
+       error_at (declspecs->locations[ds_volatile],
+                 "%<volatile%> can only be specified for objects and "
+                 "functions");
+      else if (decl_spec_seq_has_spec_p (declspecs, ds_restrict))
+       error_at (declspecs->locations[ds_restrict],
+                 "%<__restrict%> can only be specified for objects and "
+                 "functions");
+      else if (decl_spec_seq_has_spec_p (declspecs, ds_thread))
+       error_at (declspecs->locations[ds_thread],
+                 "%<__thread%> can only be specified for objects "
+                 "and functions");
       else if (saw_typedef)
-       warning (0, "%<typedef%> was ignored in this declaration");
+       warning_at (declspecs->locations[ds_typedef], 0,
+                   "%<typedef%> was ignored in this declaration");
       else if (decl_spec_seq_has_spec_p (declspecs,  ds_constexpr))
-        error ("%<constexpr%> cannot be used for type declarations");
+        error_at (declspecs->locations[ds_constexpr],
+                 "%<constexpr%> cannot be used for type declarations");
     }
 
   if (declspecs->attributes && warn_attributes && declared_type)
index b5d882df0c9d7ea3737b1ac30f0d5e344206554f..53c7018f3e078da2c12be56be77dfde8c5496d41 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/cpp0x/decl-loc1.C: New.
+       * g++.dg/cpp0x/constexpr-neg1.C: Adjust.
+       * g++.dg/cpp0x/constexpr-object1.C: Likewise.
+       * g++.dg/init/ctor8.C: Likewise.
+       * g++.dg/parse/semicolon4.C: Likewise.
+
 2015-06-03  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/66190
index dfa1d6bf12810e95eb0db3426bc1e7b0c09ee610..58b5d32c37c404be350c3d2efc34b8e8c11b3ad3 100644 (file)
@@ -5,12 +5,12 @@
 constexpr int square(int x);   // { dg-message "never defined" }
 
 // error: pixel is a type
-constexpr struct pixel {
+constexpr struct pixel {        // { dg-error "constexpr" }
   int x;
   int y;
   // OK: declaration
   constexpr pixel(int);
-};                             // { dg-error "constexpr" }
+};
 constexpr pixel::pixel(int a)
 // OK: definition
   : x(square(a)), y(square(a)) // { dg-error "square" }
index da9e3e4ab3f1a1b0e9c42923067319802a74676e..1861d404782624181ab25edc741be802c7089285 100644 (file)
@@ -22,8 +22,8 @@ const constexpr A1 a3 = A1();
 volatile constexpr A1 a4 = A1(); // { dg-bogus "both .volatile. and .constexpr. cannot" }
 
 // error: on type declaration
-constexpr struct pixel
+constexpr struct pixel // { dg-error "cannot be used for type declarations" }
 {
   int x;
   int y;
-};                  // { dg-error "cannot be used for type declarations" }
+};
diff --git a/gcc/testsuite/g++.dg/cpp0x/decl-loc1.C b/gcc/testsuite/g++.dg/cpp0x/decl-loc1.C
new file mode 100644 (file)
index 0000000..072ca7d
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++11 } }
+
+inline struct A;      // { dg-error "1:'inline'" }
+virtual struct B;     // { dg-error "1:'virtual'" }
+friend struct C;      // { dg-error "1:'friend'" }
+explicit struct D;    // { dg-error "1:'explicit'" }
+mutable struct E;     // { dg-error "1:a storage class" }
+const struct F;       // { dg-error "1:'const'" }
+volatile struct G;    // { dg-error "1:'volatile'" }
+__restrict struct H;  // { dg-error "1:'__restrict'" }
+__thread struct I;    // { dg-error "1:'__thread'" }
+typedef struct J;     // { dg-warning "1:'typedef'" }
+constexpr struct K;   // { dg-error "1:'constexpr'" }
index 3c37790c0c44bbeb2ed08354550f712507738bde..ce403a6bb612efee51cf287712de04fd587fb9ce 100644 (file)
@@ -2,7 +2,7 @@
 
 typedef struct S { // { dg-error "reference" "" { target c++11 } }
   int &r; 
-}; // { dg-warning "'typedef' was ignored" }
+}; // { dg-warning "1:'typedef' was ignored" "" { target *-*-* } 3 }
 
 
 S f () {
index adba7a873c0a2de10f60c53171dff038a228fe64..5135ec14b1f80a97401ee17c8f31ed468a0df5c2 100644 (file)
@@ -22,7 +22,7 @@ struct OK3
 struct E1
 {
   int i;
-} const;                       // { dg-error "qualifiers can only be specified for objects and functions" }
+} const;                       // { dg-error "'const' can only be specified for objects and functions" }
 
 void foo (
 struct E2