[Bug c++/70552] New: __builtin_constant_p fails to reflect the constness of constexpr calls
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 5 17:37:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70552
Bug ID: 70552
Summary: __builtin_constant_p fails to reflect the constness of
constexpr calls
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
While testing the __builtin_constant_p() intrinsic to better understand the
motivation for and problems with bug 14505, I discovered that the built-in
doesn't behave as documented for calls to constexpr functions as arguments
except in constexpr contexts, or unless optimization is enabled. For example,
the following program compiles successfully (i.e., both static assertions pass)
but then aborts at runtime.
Since not every call to a given constexpr function is necessarily a core
constant expression (i.e., a compile-time constant), for the instrinsic to be
useful with C++ constexpr expressions it needs to return the same result for
the same argument regardless of the context in which it's invoked.
This may be related to the problem as pointed out in comment #6 on bug 65656,
though the complaint there seems to be about the built-in yielding false
negatives due to folding non-constexpr expressions too early, while the problem
here seems to be that the built-in isn't attempting to fold the constexpr
function call at all without optimization.
$ cat t.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -Wall -Wextra
-Wpedantic -xc++ t.c && ./a.out
constexpr int foo () { return 1; }
#define A(e) static_assert ((e), #e)
A (1 == foo ());
A (1 == __builtin_constant_p (foo ()));
int main ()
{
if (!__builtin_constant_p (foo ()))
__builtin_abort ();
}
Aborted
More information about the Gcc-bugs
mailing list