c++: Give more expressions locations.
authorJason Merrill <jason@redhat.com>
Tue, 24 Mar 2020 22:25:17 +0000 (18:25 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 24 Mar 2020 22:25:17 +0000 (18:25 -0400)
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.

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/testsuite/g++.dg/ext/stmtexpr15.C
gcc/testsuite/g++.dg/parse/error26.C
gcc/testsuite/g++.dg/warn/Wnoexcept1.C

index 59db03c0b070b34386471eea68d64d50445db507..7ae4128a3a871727d83b5a400a23c1e5560e5ada 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR c++/93805
index 0783b3114f29b26e132bb1a084d7683899dd1ec1..4e1d0f1d42e127d4166381cae5456890ba6929c6 100644 (file)
@@ -59,7 +59,10 @@ public:
     m_value (value), m_loc (cp_expr_location (m_value)) {}
 
   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.  */
   operator tree () const { return m_value; }
index 10c4886c10c8c1cbde3818d212c576d101bf5ba2..27406e1e37f95e831d23df3a3df9906bb36b1b58 100644 (file)
@@ -4,5 +4,5 @@
 void foo()
 {
   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 }  
 }
index 95f299163e9eb8a1bcf0600cff2734ad1299cfc2..4005fd5025fc1f28b086eab23d96eb976a93bb4d 100644 (file)
@@ -4,7 +4,7 @@
 void foo()
 {
   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()
index 93210dead041559b4d2cc884d82bfc78cf83d7fe..4fac3675cf6717a594c37b0caeca5bc75c2333f2 100644 (file)
@@ -7,7 +7,7 @@
 // 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 in the fake system header.
-// { dg-warning "noexcept-expression" "" { target *-*-* } 15 }
+// { dg-warning "noexcept-expression" "" { target *-*-* } 16 }
 
 class Automatic2 {
 public: