1*f01831ebSArtem Dergachev // RUN: %clang_analyze_cc1 -analyzer-checker=core -std=c++11 -verify %s 2*f01831ebSArtem Dergachev 3*f01831ebSArtem Dergachev // expected-no-diagnostics 4*f01831ebSArtem Dergachev 5*f01831ebSArtem Dergachev typedef __typeof(sizeof(int)) size_t; 6*f01831ebSArtem Dergachev 7*f01831ebSArtem Dergachev void *operator new(size_t size, void *ptr); 8*f01831ebSArtem Dergachev 9*f01831ebSArtem Dergachev struct B { 10*f01831ebSArtem Dergachev virtual void foo(); 11*f01831ebSArtem Dergachev }; 12*f01831ebSArtem Dergachev 13*f01831ebSArtem Dergachev struct D : public B { fooD14*f01831ebSArtem Dergachev virtual void foo() override {} 15*f01831ebSArtem Dergachev }; 16*f01831ebSArtem Dergachev test_ub()17*f01831ebSArtem Dergachevvoid test_ub() { 18*f01831ebSArtem Dergachev // FIXME: Potentially warn because this code is pretty weird. 19*f01831ebSArtem Dergachev B b; 20*f01831ebSArtem Dergachev new (&b) D; 21*f01831ebSArtem Dergachev b.foo(); // no-crash 22*f01831ebSArtem Dergachev } 23*f01831ebSArtem Dergachev test_non_ub()24*f01831ebSArtem Dergachevvoid test_non_ub() { 25*f01831ebSArtem Dergachev char c[sizeof(D)]; // Should be enough storage. 26*f01831ebSArtem Dergachev new (c) D; 27*f01831ebSArtem Dergachev ((B *)c)->foo(); // no-crash 28*f01831ebSArtem Dergachev } 29