diff options
author | Reid Kleckner <rnk@google.com> | 2018-05-17 18:12:18 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2018-05-17 18:12:18 +0000 |
commit | 138ab4947c408ab849c7c27b5037ed7c2100e50f (patch) | |
tree | db828f9bd99143463a9c3671dfc2c55984d114f0 /clang/lib/AST/VTableBuilder.cpp | |
parent | 5c48b73fffcde5f9dd41fc51b2372b1d88e562bb (diff) | |
download | bcm5719-llvm-138ab4947c408ab849c7c27b5037ed7c2100e50f.tar.gz bcm5719-llvm-138ab4947c408ab849c7c27b5037ed7c2100e50f.zip |
Fix a mangling failure on clang-cl C++17
MethodVFTableLocations in MigrosoftVTableContext contains canonicalized
decl. But, it's sometimes asked to lookup for non-canonicalized decl,
and that causes assertion failure, and compilation failure.
Fixes PR37481.
Patch by Taiju Tsuiki!
Differential Revision: https://reviews.llvm.org/D46929
llvm-svn: 332639
Diffstat (limited to 'clang/lib/AST/VTableBuilder.cpp')
-rw-r--r-- | clang/lib/AST/VTableBuilder.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/AST/VTableBuilder.cpp b/clang/lib/AST/VTableBuilder.cpp index 9d7c9441085..0a3da024f14 100644 --- a/clang/lib/AST/VTableBuilder.cpp +++ b/clang/lib/AST/VTableBuilder.cpp @@ -2223,6 +2223,7 @@ ItaniumVTableContext::ItaniumVTableContext(ASTContext &Context) ItaniumVTableContext::~ItaniumVTableContext() {} uint64_t ItaniumVTableContext::getMethodVTableIndex(GlobalDecl GD) { + GD = GD.getCanonicalDecl(); MethodVTableIndicesTy::iterator I = MethodVTableIndices.find(GD); if (I != MethodVTableIndices.end()) return I->second; @@ -2503,6 +2504,8 @@ private: for (const auto &I : MethodInfoMap) { const CXXMethodDecl *MD = I.first; const MethodInfo &MI = I.second; + assert(MD == MD->getCanonicalDecl()); + // Skip the methods that the MostDerivedClass didn't override // and the entries shadowed by return adjusting thunks. if (MD->getParent() != MostDerivedClass || MI.Shadowed) @@ -3737,6 +3740,8 @@ MicrosoftVTableContext::getMethodVFTableLocation(GlobalDecl GD) { if (isa<CXXDestructorDecl>(GD.getDecl())) assert(GD.getDtorType() == Dtor_Deleting); + GD = GD.getCanonicalDecl(); + MethodVFTableLocationsTy::iterator I = MethodVFTableLocations.find(GD); if (I != MethodVFTableLocations.end()) return I->second; |