PR c++/91678 - wrong error with decltype and location wrapper.
authorMarek Polacek <polacek@redhat.com>
Sat, 7 Dec 2019 17:35:54 +0000 (17:35 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Sat, 7 Dec 2019 17:35:54 +0000 (17:35 +0000)
Compiling this testcase results in a bogus "invalid cast" error; this occurs
since the introduction of location wrappers in finish_id_expression.

Here we are parsing the decltype expression via cp_parser_decltype_expr which
can lead to calling various fold_* and c-family routines.  They use
non_lvalue_loc, but that won't create a NON_LVALUE_EXPR wrapper around a location
wrapper.

So before the location wrappers addition cp_parser_decltype_expr would return
NON_LVALUE_EXPR <c>.  Now it returns VIEW_CONVERT_EXPR<float *>(c), but the
STRIP_ANY_LOCATION_WRAPPER immediately following it strips the location wrapper,
and suddenly we don't know whether we have an lvalue anymore.  And that's sad
because then decltype produces the wrong type, causing nonsense errors.

* fold-const.c (maybe_lvalue_p): Handle VIEW_CONVERT_EXPR.

* g++.dg/cpp0x/decltype73.C: New test.

From-SVN: r279077

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype73.C [new file with mode: 0644]

index 582ffe099235ba9b57c55063648f2eaac3a1c68d..0994815f4a1c454e2622d4417831f14df1210bd6 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-07  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/91678 - wrong error with decltype and location wrapper.
+       * fold-const.c (maybe_lvalue_p): Handle VIEW_CONVERT_EXPR.
+
 2019-12-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR middle-end/90840
index c5bd45a6e34466fb4da365592f929aa6e1d9ea73..8e9e299926a126eade0f9865c5e1d52764c7899b 100644 (file)
@@ -2598,6 +2598,7 @@ maybe_lvalue_p (const_tree x)
   case TARGET_EXPR:
   case COND_EXPR:
   case BIND_EXPR:
+  case VIEW_CONVERT_EXPR:
     break;
 
   default:
index 460cff00dd15a47bac54d37c8b9aeb8829bdf0da..2d14412c7a75a88887af043cc9fdd0b003c7d1d4 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-07  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/91678 - wrong error with decltype and location wrapper.
+       * g++.dg/cpp0x/decltype73.C: New test.
+
 2019-12-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/92831
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype73.C b/gcc/testsuite/g++.dg/cpp0x/decltype73.C
new file mode 100644 (file)
index 0000000..cbe94a8
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/91678 - wrong error with decltype and location wrapper.
+// { dg-do compile { target c++11 } }
+
+float* test(float* c) { return (decltype(c + 0))(float*)c; }