Module debug info: Don't assert when encountering an incomplete definition

in isDefinedInClangModule() and assume that the incomplete definition
is not defined in the module.

This broke the -gmodules self host recently.
rdar://problem/27894367

llvm-svn: 279485
This commit is contained in:
Adrian Prantl 2016-08-22 22:23:58 +00:00
parent 9f5c83b914
commit a72972b985
4 changed files with 27 additions and 1 deletions

View File

@ -1655,7 +1655,8 @@ static bool isDefinedInClangModule(const RecordDecl *RD) {
if (!RD->isExternallyVisible() && RD->getName().empty())
return false;
if (auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) {
assert(CXXDecl->isCompleteDefinition() && "incomplete record definition");
if (!CXXDecl->isCompleteDefinition())
return false;
auto TemplateKind = CXXDecl->getTemplateSpecializationKind();
if (TemplateKind != TSK_Undeclared) {
// This is a template, check the origin of the first member.

View File

@ -0,0 +1,8 @@
/* -*- C++ -*- */
template <typename T> class Base {};
template <typename T> struct A : public Base<A<T>> {
void f();
};
class F {};
typedef A<F> AF;

View File

@ -0,0 +1,7 @@
/* -*- C++ -*- */
#include "DebugNestedA.h"
class C {
void run(AF &af) {
af.f();
}
};

View File

@ -422,3 +422,13 @@ module MacroFabs1 {
module DiagOutOfDate {
header "DiagOutOfDate.h"
}
module DebugNestedA {
header "DebugNestedA.h"
export *
}
module DebugNestedB {
header "DebugNestedB.h"
export *
}