[Bug c++/90666] New: Warn if an UB was met during constexpr evaluation attempt

antoshkka at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed May 29 12:48:00 GMT 2019


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

            Bug ID: 90666
           Summary: Warn if an UB was met during constexpr evaluation
                    attempt
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Consider the example:


constexpr int test() {
  const char* from = "wow";
  char dest[1] = {*from};

  // assignment to dereferenced one-past-the-end pointer
  dest[1] = 0;
  return 0;
}

const auto r = test();


`test()` function is a constexpr function, yet any attempt to call it causes
UB.

It would be very helpful to have a warning for a constexpr evaluation attempt
that met an UB and fell back to runtime evaluation.


Note, that such warning would be extremely helpful for contracts. It would
allow to detect contract violations at compile time:


constexpr int impl(int num)
  [[pre: num > 0]]
{
  return num + 42;
}

auto test() {
  // Core constant expression:
  const auto f0 = impl(1);

  // Runtime call to __on_contract_violation.
  // Warning would be very helpful.
  const auto f1 = impl(0); 

}


More information about the Gcc-bugs mailing list