diff options
| author | John McCall <rjmccall@apple.com> | 2010-04-20 02:18:25 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-04-20 02:18:25 +0000 |
| commit | 0f55a035cffbe4da8e4e04e2a60e922da963ec9e (patch) | |
| tree | aec75f9928a0c75ebec106d8172b4685adb4fa45 | |
| parent | 0c862a86fa0eb18d54901187ace23d75a3972dd9 (diff) | |
| download | bcm5719-llvm-0f55a035cffbe4da8e4e04e2a60e922da963ec9e.tar.gz bcm5719-llvm-0f55a035cffbe4da8e4e04e2a60e922da963ec9e.zip | |
Restore r101841 without modification. Also mark 'operator delete' as used for
actual delete expressions, not just new expressions.
llvm-svn: 101861
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 9 | ||||
| -rw-r--r-- | clang/test/CXX/expr/expr.unary/expr.new/p19.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CXX/expr/expr.unary/expr.new/p20.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/delete.cpp | 26 | ||||
| -rw-r--r-- | clang/test/SemaCXX/no-exceptions.cpp | 21 |
6 files changed, 57 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 9440772fc6e..5f1eee1f0a5 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -886,6 +886,13 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, return true; } + // We don't need an operator delete if we're running under + // -fno-exceptions. + if (!getLangOptions().Exceptions) { + OperatorDelete = 0; + return false; + } + // FindAllocationOverload can change the passed in arguments, so we need to // copy them back. if (NumPlaceArgs > 0) @@ -1392,6 +1399,8 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, return ExprError(); } + MarkDeclarationReferenced(StartLoc, OperatorDelete); + // FIXME: Check access and ambiguity of operator delete and destructor. } diff --git a/clang/test/CXX/expr/expr.unary/expr.new/p19.cpp b/clang/test/CXX/expr/expr.unary/expr.new/p19.cpp index 6134779f1fd..bb69fd55fd8 100644 --- a/clang/test/CXX/expr/expr.unary/expr.new/p19.cpp +++ b/clang/test/CXX/expr/expr.unary/expr.new/p19.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s typedef __SIZE_TYPE__ size_t; // Operator delete template for placement new with global lookup diff --git a/clang/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp b/clang/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp index c188e1e25e0..4c924b137cc 100644 --- a/clang/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp +++ b/clang/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -fexceptions %s typedef __SIZE_TYPE__ size_t; struct S { diff --git a/clang/test/CXX/expr/expr.unary/expr.new/p20.cpp b/clang/test/CXX/expr/expr.unary/expr.new/p20.cpp index 71e584e775c..8cbe2b9be3b 100644 --- a/clang/test/CXX/expr/expr.unary/expr.new/p20.cpp +++ b/clang/test/CXX/expr/expr.unary/expr.new/p20.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s typedef __SIZE_TYPE__ size_t; // Overloaded operator delete with two arguments diff --git a/clang/test/CodeGenCXX/delete.cpp b/clang/test/CodeGenCXX/delete.cpp index 7cc264f5c5f..87f8698b84c 100644 --- a/clang/test/CodeGenCXX/delete.cpp +++ b/clang/test/CodeGenCXX/delete.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -emit-llvm -o %t +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s void t1(int *a) { delete a; @@ -19,8 +19,11 @@ struct T { int a; }; +// CHECK: define void @_Z2t4P1T void t4(T *t) { - // RUN: grep "call void @_ZN1TD1Ev" %t | count 1 + // CHECK: call void @_ZN1TD1Ev + // CHECK-NEXT: bitcast + // CHECK-NEXT: call void @_ZdlPv delete t; } @@ -35,3 +38,22 @@ void f() { delete a; } + +namespace test0 { + struct A { + void *operator new(__SIZE_TYPE__ sz); + void operator delete(void *p) { ::operator delete(p); } + ~A() {} + }; + + // CHECK: define void @_ZN5test04testEPNS_1AE( + void test(A *a) { + // CHECK: call void @_ZN5test01AD1Ev + // CHECK-NEXT: bitcast + // CHECK-NEXT: call void @_ZN5test01AdlEPv + delete a; + } + + // CHECK: define linkonce_odr void @_ZN5test01AD1Ev + // CHECK: define linkonce_odr void @_ZN5test01AdlEPv +} diff --git a/clang/test/SemaCXX/no-exceptions.cpp b/clang/test/SemaCXX/no-exceptions.cpp new file mode 100644 index 00000000000..019e25c9784 --- /dev/null +++ b/clang/test/SemaCXX/no-exceptions.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// Various tests for -fno-exceptions + +typedef __SIZE_TYPE__ size_t; + +namespace test0 { + // rdar://problem/7878149 + class Foo { + public: + void* operator new(size_t x); + private: + void operator delete(void *x); + }; + + void test() { + // Under -fexceptions, this does access control for the associated + // 'operator delete'. + (void) new Foo(); + } +} |

