https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88449

            Bug ID: 88449
           Summary: __builtin_is_constant_evaluated misbehaves due to
                    constexpr call caching
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

The is-constant-evaluated1.C testcase when
constexpr inline bool
is_constant_evaluated () noexcept
{
  return __builtin_is_constant_evaluated ();
}
is added and all other __builtin_is_constant_evaluated calls are changed to
is_constant_evaluated fails (if it is made dg-do run) due to C++ constexpr call
caching.
Either we can just use the ctx->pretend_constant_evaluated as another
"argument" for the caching purposes (as the patch I'm going to attach does), or
we could do something smarter (remember during constexpr evaluation whether any
__builtin_is_constant_evaluated calls were seen), remember that in the context
and use a tri-state in the constexpr_call hash table - not seen,
pretend_constant_evaluated true or false.  But we'd need to make sure we
propagate it to all the callers right, if it is in the constexpr context,
anytime we create a new context we'd need to or it back afterwards.

Reply via email to