Commit 08ad2797 by Marek Polacek Committed by Marek Polacek

re PR c++/84854 (ICE: unexpected expression in cxx_eval_constant_expression, at…

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
parent 2170d4b6
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);
......
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.
......
// 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) { };
}
// { 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>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment