Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/ubsan/vptr-4.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line source
// Verify that -fsanitize=vptr downcast instrumentation works properly // inside of constexpr. // { dg-do compile } // { dg-options "-std=c++11 -fsanitize=vptr" } struct S { constexpr S() : a(0) {} int a; int f() { return 0; } virtual int v() { return 0; } }; struct T : S { constexpr T() : b(0) {} int b; int g() { return 0; } virtual int v() { return 1; } constexpr const T *foo() { return (const T *) reinterpret_cast<const S *> (this); } }; constexpr T t; constexpr const T *p = t.foo (); template <typename U> struct V { constexpr V() : a(0) {} int a; int f() { return 0; } virtual int v() { return 0; } }; template <typename U> struct W : V<U> { constexpr W() : b(0) {} int b; int g() { return 0; } virtual int v() { return 1; } constexpr const W<U> *foo() { return (const W<U> *) reinterpret_cast<const V<U> *> (this); } }; constexpr W<int> w; constexpr const W<int> *s = w.foo (); template <typename U> int foo (void) { static constexpr T t; static constexpr const T *p = t.foo (); static constexpr W<U> w; static constexpr const W<U> *s = w.foo (); return t.b + w.b; } int x = foo <char> ();