diff options
| author | Reid Kleckner <rnk@google.com> | 2018-07-20 20:55:00 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2018-07-20 20:55:00 +0000 |
| commit | 891b2714bc5363b0e788fe03395f6545f79ca93e (patch) | |
| tree | 6c999c0439af8aa10a5bf8de1701374950f77286 /clang/lib | |
| parent | 21524bed390f34a72e2b21d33c82cd6e185aee32 (diff) | |
| download | bcm5719-llvm-891b2714bc5363b0e788fe03395f6545f79ca93e.tar.gz bcm5719-llvm-891b2714bc5363b0e788fe03395f6545f79ca93e.zip | |
[codeview] Don't emit variable templates as class members
MSVC doesn't, so neither should we.
Fixes PR38004, which is a crash that happens when we try to emit debug
info for a still-dependent partial variable template specialization.
As a follow-up, we should review what we're doing for function and class
member templates. It looks like we don't filter those out, but I can't
seem to get clang to emit any.
llvm-svn: 337616
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 08447f895e9..10fc22a098c 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1298,10 +1298,6 @@ void CGDebugInfo::CollectRecordFields( else { const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); - // Debug info for nested types is included in the member list only for - // CodeView. - bool IncludeNestedTypes = CGM.getCodeGenOpts().EmitCodeView; - // Field number for non-static fields. unsigned fieldNo = 0; @@ -1311,6 +1307,13 @@ void CGDebugInfo::CollectRecordFields( if (const auto *V = dyn_cast<VarDecl>(I)) { if (V->hasAttr<NoDebugAttr>()) continue; + + // Skip variable template specializations when emitting CodeView. MSVC + // doesn't emit them. + if (CGM.getCodeGenOpts().EmitCodeView && + isa<VarTemplateSpecializationDecl>(V)) + continue; + // Reuse the existing static member declaration if one exists auto MI = StaticDataMemberCache.find(V->getCanonicalDecl()); if (MI != StaticDataMemberCache.end()) { @@ -1327,7 +1330,9 @@ void CGDebugInfo::CollectRecordFields( // Bump field number for next field. ++fieldNo; - } else if (IncludeNestedTypes) { + } else if (CGM.getCodeGenOpts().EmitCodeView) { + // Debug info for nested types is included in the member list only for + // CodeView. if (const auto *nestedType = dyn_cast<TypeDecl>(I)) if (!nestedType->isImplicit() && nestedType->getDeclContext() == record) |

