diff options
author | John McCall <rjmccall@apple.com> | 2011-03-07 01:52:56 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-03-07 01:52:56 +0000 |
commit | f7dcf320a7e29cd2a7b89696ba0092a63b0e0a2f (patch) | |
tree | a5c048726aaac30ea3931d66ccc3aaf5882e9f8e /clang/test/CodeGenCXX/exceptions.cpp | |
parent | e467979d0ad24f4210d7bd1bc8fb38391bb4caff (diff) | |
download | bcm5719-llvm-f7dcf320a7e29cd2a7b89696ba0092a63b0e0a2f.tar.gz bcm5719-llvm-f7dcf320a7e29cd2a7b89696ba0092a63b0e0a2f.zip |
An operator new with an empty exception specifier returns null on a bad
allocation and therefore requires a null-check. We were doing that, but
we weren't treating the new-initializer as being conditionally executed,
which means it was possible to get ill-formed IR as in PR9298.
llvm-svn: 127147
Diffstat (limited to 'clang/test/CodeGenCXX/exceptions.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/exceptions.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/exceptions.cpp b/clang/test/CodeGenCXX/exceptions.cpp index e7231cc7d30..5c38f01309c 100644 --- a/clang/test/CodeGenCXX/exceptions.cpp +++ b/clang/test/CodeGenCXX/exceptions.cpp @@ -305,3 +305,21 @@ namespace test6 { } } } + +// PR9298 +namespace test7 { + struct A { A(); ~A(); }; + struct B { + // The throw() operator means that a bad allocation is signalled + // with a null return, which means that the initializer is + // evaluated conditionally. + static void *operator new(size_t size) throw(); + B(const A&, B*); + ~B(); + }; + + // Just make sure the result passes verification. + B *test() { + return new B(A(), new B(A(), 0)); + } +} |