diff options
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 8 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 2 | ||||
-rw-r--r-- | test/SemaTemplate/example-dynarray.cpp | 14 | ||||
-rw-r--r-- | www/cxx_status.html | 6 |
5 files changed, 23 insertions, 9 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 7655f47e44..4f0d9a0c5c 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -178,6 +178,11 @@ RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD, assert(MD->isInstance() && "Trying to emit a member call expr on a static method!"); + // A call to a trivial destructor requires no code generation. + if (const CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(MD)) + if (Destructor->isTrivial()) + return RValue::get(0); + const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType(); CallArgList Args; @@ -218,6 +223,9 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) { llvm::Value *Callee; if (MD->isVirtual() && !ME->hasQualifier()) Callee = BuildVirtualCall(MD, This, Ty); + else if (const CXXDestructorDecl *Destructor + = dyn_cast<CXXDestructorDecl>(MD)) + Callee = CGM.GetAddrOfFunction(GlobalDecl(Destructor, Dtor_Complete), Ty); else Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 802df06b25..cde6e89d66 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -812,7 +812,7 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD, // If there was no specific requested type, just convert it now. if (!Ty) Ty = getTypes().ConvertType(GD.getDecl()->getType()); - return GetOrCreateLLVMFunction(getMangledName(GD.getDecl()), Ty, GD); + return GetOrCreateLLVMFunction(getMangledName(GD), Ty, GD); } /// CreateRuntimeFunction - Create a new runtime function with the specified diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index e5a4c6f81a..f8c59f4800 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2634,7 +2634,7 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, } void Sema::DefineImplicitDestructor(SourceLocation CurrentLocation, - CXXDestructorDecl *Destructor) { + CXXDestructorDecl *Destructor) { assert((Destructor->isImplicit() && !Destructor->isUsed()) && "DefineImplicitDestructor - call it for implicit default dtor"); diff --git a/test/SemaTemplate/example-dynarray.cpp b/test/SemaTemplate/example-dynarray.cpp index 7dcc508d2c..0b8d605b62 100644 --- a/test/SemaTemplate/example-dynarray.cpp +++ b/test/SemaTemplate/example-dynarray.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify %s +// RUN: clang %s -o %t #include <stddef.h> #include <stdlib.h> #include <assert.h> @@ -24,6 +24,9 @@ public: } ~dynarray() { + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); + free(Start); } @@ -33,7 +36,9 @@ public: for (unsigned I = 0, N = other.size(); I != N; ++I) new (NewStart + I) T(other[I]); - // FIXME: destroy everything in Start + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); + free(Start); Start = NewStart; Last = End = NewStart + other.size(); @@ -46,8 +51,8 @@ public: void push_back(const T& value); void pop_back() { - // FIXME: destruct old value --Last; + Last->~T(); } T& operator[](unsigned Idx) { @@ -99,7 +104,8 @@ void dynarray<T>::push_back(const T& value) { for (unsigned I = 0; I != Size; ++I) new (NewStart + I) T(Start[I]); - // FIXME: destruct old values + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); free(Start); Start = NewStart; diff --git a/www/cxx_status.html b/www/cxx_status.html index 07d8a5856e..8193787814 100644 --- a/www/cxx_status.html +++ b/www/cxx_status.html @@ -574,9 +574,9 @@ welcome!</p> <tr> <td> 5.2.4 [expr.pseudo]</td> <td class="complete"></td> - <td class="medium"></td> - <td class="medium"></td> - <td></td> + <td class="complete"></td> + <td class="complete"></td> + <td class="complete"></td> <td></td> </tr> <tr> |