decl.c (start_decl): Improve two error_at locations.

/cp
2019-01-07  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (start_decl): Improve two error_at locations.
	(expand_static_init): Likewise.

/testsuite
2019-01-07  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/diagnostic/constexpr1.C: New.
	* g++.dg/diagnostic/thread1.C: Likewise.

From-SVN: r267662
This commit is contained in:
Paolo Carlini 2019-01-07 22:28:30 +00:00 committed by Paolo Carlini
parent 33a5d8ccb5
commit 2c86a5741f
5 changed files with 40 additions and 10 deletions

View file

@ -1,3 +1,8 @@
2019-01-07 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (start_decl): Improve two error_at locations.
(expand_static_init): Likewise.
2019-01-07 Marek Polacek <polacek@redhat.com>
PR c++/88741 - wrong error with initializer-string.

View file

@ -5235,10 +5235,12 @@ start_decl (const cp_declarator *declarator,
{
bool ok = false;
if (CP_DECL_THREAD_LOCAL_P (decl))
error ("%qD declared %<thread_local%> in %<constexpr%> function",
decl);
error_at (DECL_SOURCE_LOCATION (decl),
"%qD declared %<thread_local%> in %<constexpr%> function",
decl);
else if (TREE_STATIC (decl))
error ("%qD declared %<static%> in %<constexpr%> function", decl);
error_at (DECL_SOURCE_LOCATION (decl),
"%qD declared %<static%> in %<constexpr%> function", decl);
else
ok = true;
if (!ok)
@ -8253,18 +8255,18 @@ expand_static_init (tree decl, tree init)
if (CP_DECL_THREAD_LOCAL_P (decl) && DECL_GNU_TLS_P (decl)
&& !DECL_FUNCTION_SCOPE_P (decl))
{
location_t dloc = DECL_SOURCE_LOCATION (decl);
if (init)
error ("non-local variable %qD declared %<__thread%> "
"needs dynamic initialization", decl);
error_at (dloc, "non-local variable %qD declared %<__thread%> "
"needs dynamic initialization", decl);
else
error ("non-local variable %qD declared %<__thread%> "
"has a non-trivial destructor", decl);
error_at (dloc, "non-local variable %qD declared %<__thread%> "
"has a non-trivial destructor", decl);
static bool informed;
if (!informed)
{
inform (DECL_SOURCE_LOCATION (decl),
"C++11 %<thread_local%> allows dynamic initialization "
"and destruction");
inform (dloc, "C++11 %<thread_local%> allows dynamic "
"initialization and destruction");
informed = true;
}
return;

View file

@ -1,3 +1,8 @@
2019-01-07 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/diagnostic/constexpr1.C: New.
* g++.dg/diagnostic/thread1.C: Likewise.
2019-01-07 Thomas Koenig <tkoenig@gcc.gnu.org>
Harald Anlauf <anlauf@gmx.de>
Tobias Burnus <burnus@gcc.gnu.org>

View file

@ -0,0 +1,5 @@
// { dg-do compile { target c++11 } }
constexpr int foo() { thread_local int i __attribute__((unused)) {}; return 1; } // { dg-error "40:.i. declared .thread_local." }
constexpr int bar() { static int i __attribute__((unused)) {}; return 1; } // { dg-error "34:.i. declared .static." }

View file

@ -0,0 +1,13 @@
// { dg-do compile { target c++11 } }
int foo();
__thread int i __attribute__((unused)) = foo(); // { dg-error "14:non-local variable .i. declared .__thread. needs" }
struct S
{
constexpr S() {}
~S();
};
__thread S s __attribute__((unused)); // { dg-error "12:non-local variable .s. declared .__thread. has" }