re PR c++/84854 (ICE: unexpected expression in cxx_eval_constant_expression, at cp/constexpr.c:4774)
PR c++/84854 * semantics.c (finish_if_stmt_cond): Check if the type of the condition is boolean. * g++.dg/cpp1z/constexpr-if15.C: New test. * g++.dg/cpp1z/constexpr-if16.C: New test. From-SVN: r258756
This commit is contained in:
parent
2170d4b6dd
commit
08ad2797c6
5 changed files with 47 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-03-22 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/84854
|
||||
* semantics.c (finish_if_stmt_cond): Check if the type of the condition
|
||||
is boolean.
|
||||
|
||||
2018-03-21 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/81311 - wrong C++17 overload resolution.
|
||||
|
|
|
@ -733,7 +733,10 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
|
|||
if (IF_STMT_CONSTEXPR_P (if_stmt)
|
||||
&& !type_dependent_expression_p (cond)
|
||||
&& require_constant_expression (cond)
|
||||
&& !value_dependent_expression_p (cond))
|
||||
&& !value_dependent_expression_p (cond)
|
||||
/* Wait until instantiation time, since only then COND has been
|
||||
converted to bool. */
|
||||
&& TREE_TYPE (cond) == boolean_type_node)
|
||||
{
|
||||
cond = instantiate_non_dependent_expr (cond);
|
||||
cond = cxx_constant_value (cond, NULL_TREE);
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2018-03-22 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/84854
|
||||
* g++.dg/cpp1z/constexpr-if15.C: New test.
|
||||
* g++.dg/cpp1z/constexpr-if16.C: New test.
|
||||
|
||||
2018-03-21 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/builtin-tgmath-3.c: New test.
|
||||
|
|
11
gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C
Normal file
11
gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/84854
|
||||
// { dg-options -std=c++17 }
|
||||
|
||||
constexpr int foo () { return 1; }
|
||||
constexpr int foo (int) { return 2; }
|
||||
|
||||
template <typename>
|
||||
void a()
|
||||
{
|
||||
if constexpr(foo) { };
|
||||
}
|
20
gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C
Normal file
20
gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C
Normal file
|
@ -0,0 +1,20 @@
|
|||
// { dg-options -std=c++17 }
|
||||
|
||||
struct A
|
||||
{
|
||||
constexpr operator bool () { return true; }
|
||||
int i;
|
||||
};
|
||||
|
||||
A a;
|
||||
|
||||
template <class T> void f()
|
||||
{
|
||||
constexpr bool b = a;
|
||||
if constexpr (a) { }
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
f<int>();
|
||||
}
|
Loading…
Add table
Reference in a new issue