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

            Bug ID: 106107
           Summary: dynamic_cast fail within constant expression
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pkeir at outlook dot com
  Target Milestone: ---

Created attachment 53210
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53210&action=edit
The code described in the bug report.

The dynamic_cast, evaluated within the static_assert, in the code below, fails
(GCC trunk); while the runtime assert passes. Both pass with Clang and MSVC.

I have in place a workaround for the lack of an implicit destructor in Derived
due to bug 93413 - I am not sure if this is independent of that 93413.

#include <cassert>

struct Base {
  virtual constexpr ~Base() {}
};

struct Derived : public Base
{
#if !defined(__clang__)
  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93413
  constexpr virtual ~Derived() {};
#endif
};

constexpr bool test()
{
  Base* bp = new Derived;
  Derived* dp = dynamic_cast<Derived *>(bp);
  bool b = dp != nullptr;
  delete bp;
  return b;
}

int main(int argc, char *argv[])
{
  static_assert(test());

  assert(test());

  return 0;
}

Reply via email to