mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 05:10:25 +08:00
c++: decltype of invalid non-dependent expr [PR57943]
We sometimes fail to reject an invalid non-dependent operand to decltype when inside a template, because finish_decltype_type resolves the decltype to the TREE_TYPE of the operand before we ever instantiate and fully process the operand. Fix this by adding a call to instantiate_non_dependent_expr_sfinae in finish_decltype_type. gcc/cp/ChangeLog: PR c++/57943 * semantics.c (finish_decltype_type): Call instantiate_non_dependent_expr_sfinae on the expression. gcc/testsuite/ChangeLog: PR c++/57943 * g++.dg/cpp0x/decltype76.C: New test.
This commit is contained in:
parent
9d495e7250
commit
115232b778
@ -1,3 +1,9 @@
|
||||
2020-05-16 Patrick Palka <ppalka@redhat.com>
|
||||
|
||||
PR c++/57943
|
||||
* semantics.c (finish_decltype_type): Call
|
||||
instantiate_non_dependent_expr_sfinae on the expression.
|
||||
|
||||
2020-05-15 Patrick Palka <ppalka@redhat.com>
|
||||
|
||||
Revert:
|
||||
|
@ -9746,6 +9746,14 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
|
||||
|
||||
return type;
|
||||
}
|
||||
else if (processing_template_decl)
|
||||
{
|
||||
++cp_unevaluated_operand;
|
||||
expr = instantiate_non_dependent_expr_sfinae (expr, complain);
|
||||
--cp_unevaluated_operand;
|
||||
if (expr == error_mark_node)
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
/* The type denoted by decltype(e) is defined as follows: */
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-05-16 Patrick Palka <ppalka@redhat.com>
|
||||
|
||||
PR c++/57943
|
||||
* g++.dg/cpp0x/decltype76.C: New test.
|
||||
|
||||
2020-05-15 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/coroutines/coro.h: Always #include <utility>.
|
||||
|
7
gcc/testsuite/g++.dg/cpp0x/decltype76.C
Normal file
7
gcc/testsuite/g++.dg/cpp0x/decltype76.C
Normal file
@ -0,0 +1,7 @@
|
||||
// PR c+/57943
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct a { };
|
||||
|
||||
template <typename T = decltype (a(0))> // { dg-error "" }
|
||||
void f() { }
|
Loading…
x
Reference in New Issue
Block a user