xref: /llvm-project/clang/test/Analysis/new-dynamic-types.cpp (revision f01831ebe9fb1a9395318d4f5f854ee9d862a359)
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 Dergachev void 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 Dergachev void 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