diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-07-18 01:48:10 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-07-18 01:48:10 +0000 |
commit | 3be586fec285b1d69e26ba3f3bcb206c92672a0a (patch) | |
tree | c3f5fb52d6cfcdb94ac055cac979b2acc3c753b7 /clang | |
parent | c1551a10ed0fd39fa067f035991c2cd07b669a59 (diff) | |
download | llvm-3be586fec285b1d69e26ba3f3bcb206c92672a0a.zip llvm-3be586fec285b1d69e26ba3f3bcb206c92672a0a.tar.gz llvm-3be586fec285b1d69e26ba3f3bcb206c92672a0a.tar.bz2 |
Mark the vtable used when defining implicit copy and move ctors
I don't think other implicit members like copy assignment and move
assignment require this treatment, because they should already be
operating on a constructed object.
Fixes PR20351.
llvm-svn: 213346
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-structors.cpp | 22 |
2 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 14be511..3f9e63fc 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -10384,6 +10384,8 @@ void Sema::DefineImplicitCopyConstructor(SourceLocation CurrentLocation, } CopyConstructor->markUsed(Context); + MarkVTableUsed(CurrentLocation, ClassDecl); + if (ASTMutationListener *L = getASTMutationListener()) { L->CompletedImplicitDefinition(CopyConstructor); } @@ -10542,6 +10544,7 @@ void Sema::DefineImplicitMoveConstructor(SourceLocation CurrentLocation, } MoveConstructor->markUsed(Context); + MarkVTableUsed(CurrentLocation, ClassDecl); if (ASTMutationListener *L = getASTMutationListener()) { L->CompletedImplicitDefinition(MoveConstructor); diff --git a/clang/test/CodeGenCXX/microsoft-abi-structors.cpp b/clang/test/CodeGenCXX/microsoft-abi-structors.cpp index 04227e3..7d3992b 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-structors.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-structors.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - -mconstructor-aliases -triple=i386-pc-win32 -fno-rtti > %t +// RUN: %clang_cc1 -emit-llvm -fno-rtti %s -std=c++11 -o - -mconstructor-aliases -triple=i386-pc-win32 -fno-rtti > %t // RUN: FileCheck %s < %t // vftables are emitted very late, so do another pass to try to keep the checks // in source order. @@ -406,6 +406,26 @@ void construct_b() { // CHECK: (%"struct.test1::B"* {{.*}}, i32 1, i8* {{.*}}, i32 1, i32 2) } +namespace implicit_copy_vtable { +// This was a crash that only reproduced in ABIs without key functions. +struct ImplicitCopy { + // implicit copy ctor + virtual ~ImplicitCopy(); +}; +void CreateCopy(ImplicitCopy *a) { + new ImplicitCopy(*a); +} +// CHECK: store {{.*}} @"\01??_7ImplicitCopy@implicit_copy_vtable@@6B@" + +struct MoveOnly { + MoveOnly(MoveOnly &&o) = default; + virtual ~MoveOnly(); +}; +MoveOnly &&f(); +void g() { new MoveOnly(f()); } +// CHECK: store {{.*}} @"\01??_7MoveOnly@implicit_copy_vtable@@6B@" +} + // Dtor thunks for classes in anonymous namespaces should be internal, not // linkonce_odr. namespace { |