blob: 9ffa2ff01a2d6af65f5732a5724da8d1e8989661 [file] [log] [blame]
// { dg-do compile { target c++11 } }
template <typename To, typename From>
constexpr To
bit_cast (const From &from)
{
return __builtin_bit_cast (To, from);
}
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'U' is a union type" "U" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'const U' is a union type" "const U" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'B' contains a union type" "B" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'char\\\*' is a pointer type" "char ptr" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'const int\\\*' is a pointer type" "const int ptr" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'C' contains a pointer type" "C" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'const C' contains a pointer type" "const C" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'int D::\\\*' is a pointer to member type" "ptrmem 1" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'int \\\(D::\\\*\\\)\\\(\\\) const' is a pointer to member type" "ptrmem 2" { target *-*-* } 7 }
// { dg-error "'__builtin_bit_cast' is not a constant expression because 'int \\\(D::\\\*\\\)\\\(\\\)' is a pointer to member type" "ptrmem 3" { target *-*-* } 7 }
union U { int u; };
struct A { int a; U b; };
struct B : public A { int c; };
struct C { const int *p; };
constexpr int a[] = { 1, 2, 3 };
constexpr const int *b = &a[0];
constexpr C c = { b };
struct D { int d; constexpr int foo () const { return 1; } };
constexpr int D::*d = &D::d;
constexpr int (D::*e) () const = &D::foo;
struct E { __INTPTR_TYPE__ e, f; };
constexpr E f = { 1, 2 };
constexpr U g { 0 };
constexpr auto z = bit_cast <U> (0);
constexpr auto y = bit_cast <int> (g);
constexpr auto x = bit_cast <B> (a);
constexpr auto w = bit_cast <char *> ((__INTPTR_TYPE__) 0);
constexpr auto v = bit_cast <__UINTPTR_TYPE__> (b);
constexpr auto u = bit_cast <C> ((__INTPTR_TYPE__) 0);
constexpr auto t = bit_cast <__INTPTR_TYPE__> (c);
constexpr auto s = bit_cast <__INTPTR_TYPE__> (d);
constexpr auto r = bit_cast <E> (e);
constexpr auto q = bit_cast <int D::*> ((__INTPTR_TYPE__) 0);
constexpr auto p = bit_cast <int (D::*) ()> (f);