parser.c (set_and_check_decl_spec_loc): Use rich_location::add_range in error message...
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 2 Jul 2018 21:42:10 +0000 (21:42 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 2 Jul 2018 21:42:10 +0000 (21:42 +0000)
/cp
2018-07-02  Paolo Carlini  <paolo.carlini@oracle.com>

* parser.c (set_and_check_decl_spec_loc): Use rich_location::add_range
in error message about __thread and thread_local at the same time.

/testsuite
2018-07-02  Paolo Carlini  <paolo.carlini@oracle.com>

* g++.dg/diagnostic/thread-thread_local.C: New.

From-SVN: r262321

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/diagnostic/thread-thread_local.C [new file with mode: 0644]

index 556b154b14e99bd659b7946e2cc5bd5c3eb992c5..53bcb1f93192e3d0af6a7ac9edf455b87afedd49 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * parser.c (set_and_check_decl_spec_loc): Use rich_location::add_range
+       in error message about __thread and thread_local at the same time.
+
 2018-06-29  Marek Polacek  <polacek@redhat.com>
 
        PR c++/86184
index a076de146e6c4e7ab5db159171fcaaf8278b245c..5edd0eed76e8983002ee9af22a7b0c4eccf16d77 100644 (file)
@@ -28377,12 +28377,15 @@ set_and_check_decl_spec_loc (cp_decl_specifier_seq *decl_specs,
       else if (ds == ds_thread)
        {
          bool gnu = token_is__thread (token);
+         gcc_rich_location richloc (location);
          if (gnu != decl_specs->gnu_thread_keyword_p)
-           error_at (location,
-                     "both %<__thread%> and %<thread_local%> specified");
+           {
+             richloc.add_range (decl_specs->locations[ds_thread], false);
+             error_at (&richloc,
+                       "both %<__thread%> and %<thread_local%> specified");
+           }
          else
            {
-             gcc_rich_location richloc (location);
              richloc.add_fixit_remove ();
              error_at (&richloc, "duplicate %qD", token->u.value);
            }
index b4eabd975291eccae8158c94c20b3a60396185c6..f2485db4f0fce57a415c07f28ce217b899f86586 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * g++.dg/diagnostic/thread-thread_local.C: New.
+
 2018-07-02  Martin Liska  <mliska@suse.cz>
 
         PR testsuite/86366
diff --git a/gcc/testsuite/g++.dg/diagnostic/thread-thread_local.C b/gcc/testsuite/g++.dg/diagnostic/thread-thread_local.C
new file mode 100644 (file)
index 0000000..4f2264c
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-options "-fdiagnostics-show-caret" }
+// { dg-do compile { target c++11 } }
+
+thread_local __thread int a;  // { dg-error "14:both .__thread. and .thread_local. specified" }
+/* { dg-begin-multiline-output "" }
+ thread_local __thread int a;
+ ~~~~~~~~~~~~ ^~~~~~~~
+   { dg-end-multiline-output "" } */
+__thread thread_local int b;  // { dg-error "10:both .__thread. and .thread_local. specified" }
+/* { dg-begin-multiline-output "" }
+ __thread thread_local int b;
+ ~~~~~~~~ ^~~~~~~~~~~~
+   { dg-end-multiline-output "" } */