+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
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);
}
+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
--- /dev/null
+// { 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 "" } */