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)
commitbfbe98c7e0d570c903c89359cd25073e538a365e
tree0ceaef0721dd5c5812bccb95688416b27a8f1adb
parentea37206decb6b4df127e65af206c58e6fc3ae60a
PR c++/91678 - wrong error with decltype and location wrapper.

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]