Commit b08bcba5 by Paolo Carlini Committed by Paolo Carlini

decl.c (has_designator_problem): Use cp_expr_loc_or_input_loc in error_at.

/cp
2019-09-10  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (has_designator_problem): Use cp_expr_loc_or_input_loc
	in error_at.
	(build_enumerator): Likewise.
	(cp_finish_decl): Use DECL_SOURCE_LOCATION.
	(grokdeclarator): Use id_loc in two error_at; change errror
	message about constinit together constexpr to use two ranges.

/testsuite
2019-09-10  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/enum29.C: Test location(s) too.
	* g++.dg/cpp0x/lambda/lambda-ice10.C: Likewise.
	* g++.dg/cpp2a/constinit3.C: Likewise.
	* g++.dg/ext/desig4.C: Likewise.
	* g++.dg/ext/label10.C: Likewise.
	* g++.old-deja/g++.other/dtor3.C: Likewise.

From-SVN: r275585
parent a360a359
2019-09-10 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (has_designator_problem): Use cp_expr_loc_or_input_loc
in error_at.
(build_enumerator): Likewise.
(cp_finish_decl): Use DECL_SOURCE_LOCATION.
(grokdeclarator): Use id_loc in two error_at; change errror
message about constinit together constexpr to use two ranges.
2019-09-09 Marek Polacek <polacek@redhat.com> 2019-09-09 Marek Polacek <polacek@redhat.com>
PR c++/84374 - diagnose invalid uses of decltype(auto). PR c++/84374 - diagnose invalid uses of decltype(auto).
......
...@@ -6114,7 +6114,8 @@ has_designator_problem (reshape_iter *d, tsubst_flags_t complain) ...@@ -6114,7 +6114,8 @@ has_designator_problem (reshape_iter *d, tsubst_flags_t complain)
if (d->cur->index) if (d->cur->index)
{ {
if (complain & tf_error) if (complain & tf_error)
error ("C99 designator %qE outside aggregate initializer", error_at (cp_expr_loc_or_input_loc (d->cur->index),
"C99 designator %qE outside aggregate initializer",
d->cur->index); d->cur->index);
else else
return true; return true;
...@@ -7288,8 +7289,9 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -7288,8 +7289,9 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
if ((flags & LOOKUP_CONSTINIT) if ((flags & LOOKUP_CONSTINIT)
&& !(dk == dk_thread || dk == dk_static)) && !(dk == dk_thread || dk == dk_static))
{ {
error ("%<constinit%> can only be applied to a variable with static " error_at (DECL_SOURCE_LOCATION (decl),
"or thread storage duration"); "%<constinit%> can only be applied to a variable with "
"static or thread storage duration");
return; return;
} }
...@@ -10628,7 +10630,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10628,7 +10630,8 @@ grokdeclarator (const cp_declarator *declarator,
&& !uniquely_derived_from_p (ctype, && !uniquely_derived_from_p (ctype,
current_class_type)) current_class_type))
{ {
error ("invalid use of qualified-name %<%T::%D%>", error_at (id_declarator->id_loc,
"invalid use of qualified-name %<%T::%D%>",
qualifying_scope, decl); qualifying_scope, decl);
return error_mark_node; return error_mark_node;
} }
...@@ -10816,8 +10819,9 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10816,8 +10819,9 @@ grokdeclarator (const cp_declarator *declarator,
keywords shall appear in a decl-specifier-seq." */ keywords shall appear in a decl-specifier-seq." */
if (constinit_p && constexpr_p) if (constinit_p && constexpr_p)
{ {
error_at (min_location (declspecs->locations[ds_constinit], gcc_rich_location richloc (declspecs->locations[ds_constinit]);
declspecs->locations[ds_constexpr]), richloc.add_range (declspecs->locations[ds_constexpr]);
error_at (&richloc,
"can use at most one of the %<constinit%> and %<constexpr%> " "can use at most one of the %<constinit%> and %<constexpr%> "
"specifiers"); "specifiers");
return error_mark_node; return error_mark_node;
...@@ -11831,7 +11835,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11831,7 +11835,8 @@ grokdeclarator (const cp_declarator *declarator,
&& inner_declarator->u.id.sfk == sfk_destructor && inner_declarator->u.id.sfk == sfk_destructor
&& arg_types != void_list_node) && arg_types != void_list_node)
{ {
error ("destructors may not have parameters"); error_at (declarator->id_loc,
"destructors may not have parameters");
arg_types = void_list_node; arg_types = void_list_node;
parms = NULL_TREE; parms = NULL_TREE;
} }
...@@ -15171,7 +15176,8 @@ build_enumerator (tree name, tree value, tree enumtype, tree attributes, ...@@ -15171,7 +15176,8 @@ build_enumerator (tree name, tree value, tree enumtype, tree attributes,
if (! INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P if (! INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P
(TREE_TYPE (value))) (TREE_TYPE (value)))
{ {
error ("enumerator value for %qD must have integral or " error_at (cp_expr_loc_or_input_loc (value),
"enumerator value for %qD must have integral or "
"unscoped enumeration type", name); "unscoped enumeration type", name);
value = NULL_TREE; value = NULL_TREE;
} }
......
2019-09-10 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp0x/enum29.C: Test location(s) too.
* g++.dg/cpp0x/lambda/lambda-ice10.C: Likewise.
* g++.dg/cpp2a/constinit3.C: Likewise.
* g++.dg/ext/desig4.C: Likewise.
* g++.dg/ext/label10.C: Likewise.
* g++.old-deja/g++.other/dtor3.C: Likewise.
2019-09-10 Christophe Lyon <christophe.lyon@st.com> 2019-09-10 Christophe Lyon <christophe.lyon@st.com>
* lib/target-supports.exp (check_effective_target_static): Disable * lib/target-supports.exp (check_effective_target_static): Disable
......
...@@ -38,7 +38,7 @@ enum E0 { e0 = X0() }; ...@@ -38,7 +38,7 @@ enum E0 { e0 = X0() };
enum E1 { e1 = X1() }; enum E1 { e1 = X1() };
enum E2 { e2 = X2() }; enum E2 { e2 = X2() };
enum E3 { e3 = X3() }; enum E3 { e3 = X3() };
enum E4 { e4 = X4() }; // { dg-error "integral" } enum E4 { e4 = X4() }; // { dg-error "16:enumerator value for .e4. must have integral" }
enum E5 { e5 = X5() }; // { dg-error "ambiguous" } enum E5 { e5 = X5() }; // { dg-error "ambiguous" }
enum F0 : int { f0 = X0() }; enum F0 : int { f0 = X0() };
......
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
template<int> struct A template<int> struct A
{ {
static const int i; static const int i;
template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "invalid use" } template<int N> const int A<N>::i = []{ return 0; }(); // { dg-error "29:invalid use" }
}; };
...@@ -31,8 +31,8 @@ int ...@@ -31,8 +31,8 @@ int
fn1 () fn1 ()
{ {
// Not static storage // Not static storage
constinit int a1 = 42; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" } constinit int a1 = 42; // { dg-error "17:.constinit. can only be applied to a variable with static or thread storage" }
constinit int a2 = 42; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" } constinit int a2 = 42; // { dg-error "17:.constinit. can only be applied to a variable with static or thread storage" }
extern constinit int e1; extern constinit int e1;
return 0; return 0;
...@@ -46,7 +46,7 @@ fn3 () ...@@ -46,7 +46,7 @@ fn3 ()
void void
fn2 (int i, constinit int p) // { dg-error "a parameter cannot be declared .constinit." } fn2 (int i, constinit int p) // { dg-error "a parameter cannot be declared .constinit." }
{ {
constinit auto l = [i](){ return i; }; // { dg-error ".constinit. can only be applied to a variable with static or thread storage" } constinit auto l = [i](){ return i; }; // { dg-error "18:.constinit. can only be applied to a variable with static or thread storage" }
} }
struct B { int d; }; struct B { int d; };
......
// PR c++/51458 // PR c++/51458
// { dg-options "" } // { dg-options "" }
char g[] = { [7] = "abcd" }; // { dg-error "designator" } char g[] = { [7] = "abcd" }; // { dg-error "15:designator .7." }
int a = { .foo = 6 }; // { dg-error "designator" } int a = { .foo = 6 }; // { dg-error "designator" }
int b = { [0] = 1 }; // { dg-error "designator" } int b = { [0] = 1 }; // { dg-error "12:designator .0." }
_Complex float c = { .foo = 0, 1 }; // { dg-error "designator" } _Complex float c = { .foo = 0, 1 }; // { dg-error "designator" }
// { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 } // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
// { dg-error "cannot convert" "" { target *-*-* } .-2 } // { dg-error "cannot convert" "" { target *-*-* } .-2 }
_Complex float d = { [0] = 0, 1 }; // { dg-error "designator" } _Complex float d = { [0] = 0, 1 }; // { dg-error "23:designator .0." }
// { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 } // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
// { dg-error "cannot convert" "" { target *-*-* } .-2 } // { dg-error "cannot convert" "" { target *-*-* } .-2 }
_Complex float e = { 0, .foo = 1 }; // { dg-error "designator" } _Complex float e = { 0, .foo = 1 }; // { dg-error "designator" }
// { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 } // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
// { dg-error "cannot convert" "" { target *-*-* } .-2 } // { dg-error "cannot convert" "" { target *-*-* } .-2 }
_Complex float f = { 0, [0] = 1 }; // { dg-error "designator" } _Complex float f = { 0, [0] = 1 }; // { dg-error "26:designator .0." }
// { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 } // { dg-error "either all initializer clauses should be designated or none of them should be" "" { target c++2a } .-1 }
// { dg-error "cannot convert" "" { target *-*-* } .-2 } // { dg-error "cannot convert" "" { target *-*-* } .-2 }
...@@ -12,6 +12,6 @@ A<0> a; ...@@ -12,6 +12,6 @@ A<0> a;
void foo () void foo ()
{ {
__label__ P; __label__ P;
enum { O = && P }; // { dg-error "cannot appear in|integral" } enum { O = && P }; // { dg-error "14:enumerator value for .O. must have integral|cannot appear in" }
P:; P:;
} }
...@@ -2,27 +2,27 @@ ...@@ -2,27 +2,27 @@
struct S1 struct S1
{ {
~S1(int); // { dg-error "" } destructors may not have parameters ~S1(int); // { dg-error "3:destructors may not have parameters" }
}; };
template <class T> template <class T>
struct S2 struct S2
{ {
~S2(int); // { dg-error "" } destructors may not have parameters ~S2(int); // { dg-error "3:destructors may not have parameters" }
}; };
struct S3 struct S3
{ {
~S3(double) {} // { dg-error "" } destructors may not have parameters ~S3(double) {} // { dg-error "3:destructors may not have parameters" }
}; };
template <class T> template <class T>
struct S4 struct S4
{ {
~S4(double) {} // { dg-error "" } destructors may not have parameters ~S4(double) {} // { dg-error "3:destructors may not have parameters" }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment