re PR c++/83116 (Statement with no effect causes wrong code of static object constexpr method)

PR c++/83116
	* constexpr.c (cxx_eval_call_expression): Only look into
	constexpr_call_table if ctx->strict.

	* g++.dg/cpp1y/constexpr-83116.C: New test.

From-SVN: r255813
This commit is contained in:
Marek Polacek 2017-12-19 10:02:48 +00:00 committed by Marek Polacek
parent 109836feac
commit fe513fce56
3 changed files with 28 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2017-12-19 Marek Polacek <polacek@redhat.com>
Backported from mainline
2017-12-18 Marek Polacek <polacek@redhat.com>
PR c++/83116
* constexpr.c (cxx_eval_call_expression): Only look into
constexpr_call_table if ctx->strict.
2017-12-16 Jakub Jelinek <jakub@redhat.com>
Backported from mainline

View File

@ -1558,7 +1558,7 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
tree result = NULL_TREE;
constexpr_call *entry = NULL;
if (depth_ok && !non_constant_args)
if (depth_ok && !non_constant_args && ctx->strict)
{
new_call.hash = iterative_hash_template_arg
(new_call.bindings, constexpr_fundef_hasher::hash (new_call.fundef));

View File

@ -0,0 +1,18 @@
// PR c++/83116
// { dg-do run { target c++14 } }
// { dg-options "-O2" }
struct S {
constexpr S () : s(0) { foo (); }
constexpr int foo () { return s; }
int s;
};
int
main ()
{
static S var;
var.s = 5;
if (var.s != 5 || var.foo () != 5)
__builtin_abort ();
}