[Bug c++/70197] New: dynamic_cast treated as constant expression

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 11 20:20:00 GMT 2016


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

            Bug ID: 70197
           Summary: dynamic_cast treated as constant expression
           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: ---

According to [expr.const] of C14 the result of the dynamic_cast operator is not
a core constant expression and thus cannot be used in contexts where core
constant expressions are required such as in constexpr expressions or as
template arguments.  Therefore, the program below is ill-formed and should be
rejected with an error (as it is for example by Clang), but it is accepted by
GCC 6 and prior.

$ cat v.c && /home/msebor/build/gcc-trunk-svn/gcc/xgcc
-B/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wextra -Wpedantic -o/dev/null
-xc++ v.c
struct A { virtual ~A (); } a;
struct B: A { } b;

constexpr A *p0 = dynamic_cast<A*>(&a);
constexpr B *p1 = dynamic_cast<B*>(&a);
constexpr B *p2 = dynamic_cast<B*>(&b);

template <class T, T*> struct S { };
S<A, dynamic_cast<A*>(&a)> s0;
S<B, dynamic_cast<B*>(&a)> s1;
S<B, dynamic_cast<B*>(&b)> s2;
v.c:5:38: warning: dynamic_cast of ‘A a’ to ‘struct B*’ can never succeed
 constexpr B *p1 = dynamic_cast<B*>(&a);
                                      ^
v.c:10:25: warning: dynamic_cast of ‘A a’ to ‘struct B*’ can never succeed
 S<B, dynamic_cast<B*>(&a)> s1;
                         ^


More information about the Gcc-bugs mailing list