Commit 6e771c08 by Jason Merrill

c++: Give more expressions locations.

In the testcase for PR94186, we have a SCOPE_REF with no location even
though at one point it was in a cp_expr which had a location.  So let's make
the cp_expr constructor that takes a location apply it to the expression
when possible.

gcc/cp/ChangeLog
2020-03-24  Jason Merrill  <jason@redhat.com>

	* cp-tree.h (cp_expr): When constructing from an expr and a
	location, call protected_set_expr_location.
parent 07f8bcc6
2020-03-24 Jason Merrill <jason@redhat.com>
* cp-tree.h (cp_expr): When constructing from an expr and a
location, call protected_set_expr_location.
2020-03-23 Patrick Palka <ppalka@redhat.com> 2020-03-23 Patrick Palka <ppalka@redhat.com>
PR c++/93805 PR c++/93805
......
...@@ -59,7 +59,10 @@ public: ...@@ -59,7 +59,10 @@ public:
m_value (value), m_loc (cp_expr_location (m_value)) {} m_value (value), m_loc (cp_expr_location (m_value)) {}
cp_expr (tree value, location_t loc): cp_expr (tree value, location_t loc):
m_value (value), m_loc (loc) {} m_value (value), m_loc (loc)
{
protected_set_expr_location (value, loc);
}
/* Implicit conversions to tree. */ /* Implicit conversions to tree. */
operator tree () const { return m_value; } operator tree () const { return m_value; }
......
...@@ -4,5 +4,5 @@ ...@@ -4,5 +4,5 @@
void foo() void foo()
{ {
int x[({ return; })]; // { dg-error "could not convert" } int x[({ return; })]; // { dg-error "could not convert" }
// { dg-error "12:size of array .x. has non-integral" "" { target *-*-* } .-1 } // { dg-error "9:size of array .x. has non-integral" "" { target *-*-* } .-1 }
} }
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
void foo() void foo()
{ {
if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" } if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" }
// { dg-error "17:could not convert" "17" { target *-*-* } .-1 } // { dg-error "7:could not convert" "17" { target *-*-* } .-1 }
} }
void bar() void bar()
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
// We expect a warning at the declaration of construct2, since Automatic2 is // We expect a warning at the declaration of construct2, since Automatic2 is
// defined below; we don't expect one for construct1, because Automatic1 is // defined below; we don't expect one for construct1, because Automatic1 is
// defined in the fake system header. // defined in the fake system header.
// { dg-warning "noexcept-expression" "" { target *-*-* } 15 } // { dg-warning "noexcept-expression" "" { target *-*-* } 16 }
class Automatic2 { class Automatic2 {
public: public:
......
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