diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-08-03 08:39:58 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-08-03 08:39:58 +0000 |
| commit | 73d1be7c56e1fd92d4a27ff53bc6783a269b1362 (patch) | |
| tree | b9cf20828a5999dbc7bc804d9e7608211ff481fa /clang | |
| parent | 08ffdba6bdba3f76a81b8bdbcb06f654d2401e8b (diff) | |
| download | bcm5719-llvm-73d1be7c56e1fd92d4a27ff53bc6783a269b1362.tar.gz bcm5719-llvm-73d1be7c56e1fd92d4a27ff53bc6783a269b1362.zip | |
Fix failed to generate vtables in certain cases.
By C++ standard, the vtable should be generated if the first non-inline
virtual function is defined in the TU. Current version of clang doesn't
generate vtable if the first virtual function is defaulted, because the
key function is regarded as the defaulted function.
Patch by Li Kan!
llvm-svn: 161236
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/cxx11-vtable-key-function.cpp | 11 |
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 86a881481c9..747b3529ceb 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2351,6 +2351,9 @@ RecordLayoutBuilder::ComputeKeyFunction(const CXXRecordDecl *RD) { if (MD->hasInlineBody()) continue; + if (!MD->isUserProvided()) + continue; + // We found it. return MD; } diff --git a/clang/test/CodeGenCXX/cxx11-vtable-key-function.cpp b/clang/test/CodeGenCXX/cxx11-vtable-key-function.cpp new file mode 100644 index 00000000000..705a4addf63 --- /dev/null +++ b/clang/test/CodeGenCXX/cxx11-vtable-key-function.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -std=c++11 | FileCheck %s +// PR13424 + +struct X { + virtual ~X() = default; + virtual void f(); +}; + +void X::f() {} + +// CHECK: @_ZTV1X = unnamed_addr constant |

