From a78fa9ec7a1a7cb5d2c62ef822e70ec7bbe415f4 Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl@apple.com>
Date: Mon, 22 Aug 2016 22:23:58 +0000
Subject: [PATCH] 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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@279485 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/CodeGen/CGDebugInfo.cpp        |  3 ++-
 test/Modules/Inputs/DebugNestedA.h |  8 ++++++++
 test/Modules/Inputs/DebugNestedB.h |  7 +++++++
 test/Modules/Inputs/module.map     | 10 ++++++++++
 4 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 test/Modules/Inputs/DebugNestedA.h
 create mode 100644 test/Modules/Inputs/DebugNestedB.h

diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp
index a153193a53f..af0cd02ed2f 100644
--- a/lib/CodeGen/CGDebugInfo.cpp
+++ b/lib/CodeGen/CGDebugInfo.cpp
@@ -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.
diff --git a/test/Modules/Inputs/DebugNestedA.h b/test/Modules/Inputs/DebugNestedA.h
new file mode 100644
index 00000000000..58dc2a7df74
--- /dev/null
+++ b/test/Modules/Inputs/DebugNestedA.h
@@ -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;
diff --git a/test/Modules/Inputs/DebugNestedB.h b/test/Modules/Inputs/DebugNestedB.h
new file mode 100644
index 00000000000..7f75d0946e2
--- /dev/null
+++ b/test/Modules/Inputs/DebugNestedB.h
@@ -0,0 +1,7 @@
+/* -*- C++ -*- */
+#include "DebugNestedA.h"
+class C {
+  void run(AF &af) {
+    af.f();
+  }
+};
diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map
index a683190e182..2beb942861a 100644
--- a/test/Modules/Inputs/module.map
+++ b/test/Modules/Inputs/module.map
@@ -422,3 +422,13 @@ module MacroFabs1 {
 module DiagOutOfDate {
   header "DiagOutOfDate.h"
 }
+
+module DebugNestedA {
+  header "DebugNestedA.h"
+  export *
+}
+
+module DebugNestedB {
+  header "DebugNestedB.h"
+  export *
+}
-- 
GitLab