diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-05-18 20:36:47 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-05-18 20:36:47 +0000 |
commit | c7e6ff02d5cf03b8e36f95bfb0dfb09f7cec8e4a (patch) | |
tree | eb8968b1486d47eb5264b583c6cef83f86aa8541 /clang/lib/Sema/SemaTemplate.cpp | |
parent | fa3872e7ad06f2959f61eba4f0a5c91be7133091 (diff) | |
download | bcm5719-llvm-c7e6ff02d5cf03b8e36f95bfb0dfb09f7cec8e4a.tar.gz bcm5719-llvm-c7e6ff02d5cf03b8e36f95bfb0dfb09f7cec8e4a.zip |
[modules] Support for merging a parsed class template specialization definition into an imported but hidden definition.
llvm-svn: 237612
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 687e6111f2d..5319836c249 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -6052,7 +6052,9 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, SourceLocation ModulePrivateLoc, TemplateIdAnnotation &TemplateId, AttributeList *Attr, - MultiTemplateParamsArg TemplateParameterLists) { + MultiTemplateParamsArg + TemplateParameterLists, + SkipBodyInfo *SkipBody) { assert(TUK != TUK_Reference && "References are not specializations"); CXXScopeSpec &SS = TemplateId.SS; @@ -6363,7 +6365,14 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, // Check that this isn't a redefinition of this specialization. if (TUK == TUK_Definition) { - if (RecordDecl *Def = Specialization->getDefinition()) { + RecordDecl *Def = Specialization->getDefinition(); + NamedDecl *Hidden = nullptr; + if (Def && SkipBody && !hasVisibleDefinition(Def, &Hidden)) { + SkipBody->ShouldSkip = true; + makeMergedDefinitionVisible(Hidden, KWLoc); + // From here on out, treat this as just a redeclaration. + TUK = TUK_Declaration; + } else if (Def) { SourceRange Range(TemplateNameLoc, RAngleLoc); Diag(TemplateNameLoc, diag::err_redefinition) << Context.getTypeDeclType(Specialization) << Range; |