Commit 99e764a2 by Marek Polacek Committed by Marek Polacek

PR c++/90825 - endless recursion when evaluating sizeof.

	PR c++/90832 - endless recursion when evaluating sizeof.
	* constexpr.c (cxx_eval_constant_expression): Don't recurse on the
	result of fold_sizeof_expr if is returns a SIZEOF_EXPR.
	* typeck.c (cxx_sizeof_expr): Only return a SIZEOF_EXPR if the operand
	is instantiation-dependent.

	* g++.dg/cpp0x/constexpr-sizeof2.C: New test.
	* g++.dg/cpp0x/constexpr-sizeof3.C: New test.

From-SVN: r272221
parent d52a6e0a
2019-06-12 Marek Polacek <polacek@redhat.com> 2019-06-12 Marek Polacek <polacek@redhat.com>
PR c++/90825 - endless recursion when evaluating sizeof.
PR c++/90832 - endless recursion when evaluating sizeof.
* constexpr.c (cxx_eval_constant_expression): Don't recurse on the
result of fold_sizeof_expr if is returns a SIZEOF_EXPR.
* typeck.c (cxx_sizeof_expr): Only return a SIZEOF_EXPR if the operand
is instantiation-dependent.
PR c++/90736 - bogus error with alignof. PR c++/90736 - bogus error with alignof.
* constexpr.c (adjust_temp_type): Use cv_unqualified type. * constexpr.c (adjust_temp_type): Use cv_unqualified type.
......
...@@ -4810,9 +4810,19 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, ...@@ -4810,9 +4810,19 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
break; break;
case SIZEOF_EXPR: case SIZEOF_EXPR:
r = cxx_eval_constant_expression (ctx, fold_sizeof_expr (t), lval, r = fold_sizeof_expr (t);
non_constant_p, overflow_p, /* In a template, fold_sizeof_expr may merely create a new SIZEOF_EXPR,
jump_target); which could lead to an infinite recursion. */
if (TREE_CODE (r) != SIZEOF_EXPR)
r = cxx_eval_constant_expression (ctx, r, lval,
non_constant_p, overflow_p,
jump_target);
else
{
*non_constant_p = true;
gcc_assert (ctx->quiet);
}
break; break;
case COMPOUND_EXPR: case COMPOUND_EXPR:
......
...@@ -1690,7 +1690,7 @@ cxx_sizeof_expr (tree e, tsubst_flags_t complain) ...@@ -1690,7 +1690,7 @@ cxx_sizeof_expr (tree e, tsubst_flags_t complain)
if (e == error_mark_node) if (e == error_mark_node)
return error_mark_node; return error_mark_node;
if (processing_template_decl) if (instantiation_dependent_uneval_expression_p (e))
{ {
e = build_min (SIZEOF_EXPR, size_type_node, e); e = build_min (SIZEOF_EXPR, size_type_node, e);
TREE_SIDE_EFFECTS (e) = 0; TREE_SIDE_EFFECTS (e) = 0;
......
2019-06-11 Marek Polacek <polacek@redhat.com>
PR c++/90825 - endless recursion when evaluating sizeof.
PR c++/90832 - endless recursion when evaluating sizeof.
* g++.dg/cpp0x/constexpr-sizeof2.C: New test.
* g++.dg/cpp0x/constexpr-sizeof3.C: New test.
2019-06-12 Martin Sebor <msebor@redhat.com> 2019-06-12 Martin Sebor <msebor@redhat.com>
PR middle-end/90676 PR middle-end/90676
......
// PR c++/90825 - endless recursion when evaluating sizeof.
// { dg-do compile { target c++11 } }
class address {
char host_[63];
public:
static constexpr unsigned buffer_size() noexcept { return sizeof(host_); }
};
template <class Archive>
void load()
{
char host[address::buffer_size()];
}
// PR c++/90832 - endless recursion when evaluating sizeof.
// { dg-do compile { target c++11 } }
class B
{
template <typename T> friend struct A;
B() {}
};
template <typename T>
struct A
{
A() noexcept(sizeof(B{})) { }
};
struct C
{
C()
{
static_assert( sizeof(A<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