c++: constexpr and volatile member function [PR80456]

When calling a static member function we still need to evaluate an explicit
object argument.  But we don't want to force a load of the entire object
if the argument is volatile, so we take its address.  If as a result it no
longer has any side-effects, we don't need to evaluate it after all.

gcc/cp/ChangeLog:

	PR c++/80456
	* call.c (build_new_method_call_1): Check again for side-effects
	with a volatile object.

gcc/testsuite/ChangeLog:

	PR c++/80456
	* g++.dg/cpp0x/constexpr-volatile3.C: New test.
This commit is contained in:
Jason Merrill 2021-04-15 15:13:18 -04:00
parent 2dbbbe893f
commit 3682052e4c
2 changed files with 17 additions and 1 deletions

View File

@ -10793,7 +10793,8 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
tree a = instance;
if (TREE_THIS_VOLATILE (a))
a = build_this (a);
call = build2 (COMPOUND_EXPR, TREE_TYPE (call), a, call);
if (TREE_SIDE_EFFECTS (a))
call = build2 (COMPOUND_EXPR, TREE_TYPE (call), a, call);
}
else if (call != error_mark_node
&& DECL_DESTRUCTOR_P (cand->fn)

View File

@ -0,0 +1,15 @@
// PR c++/80456
// { dg-do compile { target c++11 } }
struct A {
static constexpr bool test() noexcept { return true; }
void f() volatile {
constexpr bool b = test();
}
};
void g() {
A a;
a.f();
}