diff options
author | Anders Carlsson <andersca@mac.com> | 2010-01-26 05:26:39 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-01-26 05:26:39 +0000 |
commit | 0b5f1ddf0a9bee17355ab3aa04d5e7cf13a16527 (patch) | |
tree | 07d3a93ddaf254461189c75f94d28fcd04a2f45d | |
parent | 17ed0496c566930ff51923b9c9b98da687213dda (diff) | |
download | bcm5719-llvm-0b5f1ddf0a9bee17355ab3aa04d5e7cf13a16527.tar.gz bcm5719-llvm-0b5f1ddf0a9bee17355ab3aa04d5e7cf13a16527.zip |
Fix another debug info crash with virtual bases.
llvm-svn: 94520
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 15 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/debug-info.cpp | 11 |
2 files changed, 21 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index e1aeb5ed8cc..cb8752e7d57 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -615,21 +615,28 @@ CollectCXXBases(const CXXRecordDecl *Decl, for (CXXRecordDecl::base_class_const_iterator BI = Decl->bases_begin(), BE = Decl->bases_end(); BI != BE; ++BI) { unsigned BFlags = 0; - if (BI->isVirtual()) + uint64_t BaseOffset; + + const CXXRecordDecl *Base = + cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); + + if (BI->isVirtual()) { + BaseOffset = RL.getVBaseClassOffset(Base); BFlags = llvm::DIType::FlagVirtual; + } else + BaseOffset = RL.getBaseClassOffset(Base); + AccessSpecifier Access = BI->getAccessSpecifier(); if (Access == clang::AS_private) BFlags |= llvm::DIType::FlagPrivate; else if (Access == clang::AS_protected) BFlags |= llvm::DIType::FlagProtected; - const CXXRecordDecl *Base = - cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); llvm::DIType DTy = DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_inheritance, RecordTy, llvm::StringRef(), llvm::DICompileUnit(), 0, 0, 0, - RL.getBaseClassOffset(Base), BFlags, + BaseOffset, BFlags, getOrCreateType(BI->getType(), Unit)); EltTys.push_back(DTy); diff --git a/clang/test/CodeGenCXX/debug-info.cpp b/clang/test/CodeGenCXX/debug-info.cpp index f18e9b08a02..6bb9533a477 100644 --- a/clang/test/CodeGenCXX/debug-info.cpp +++ b/clang/test/CodeGenCXX/debug-info.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm-only -g +// RUN: %clang_cc1 -emit-llvm-only -g %s template<typename T> struct Identity { typedef T Type; }; @@ -41,3 +41,12 @@ namespace VirtualDtor { Y::~Y() { } } + +namespace VirtualBase { + struct A { }; + struct B : virtual A { }; + + void f() { + B b; + } +} |