From 74c8e4941e2b49a76f42955ff4dadaaff0345d8e Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 9 Jan 2021 19:14:16 +0200 Subject: [PATCH] Instantiate types in template specializations Signed-off-by: Dimitar Dobrev --- src/CppParser/Parser.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index c70bd444..446c21fe 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -39,8 +39,13 @@ #include #include #include +// HACK: change a private setting to avoid an inexplicable and unimportant crash +#define private public +#include +#define private private #include #include +#include #include #include #include @@ -3033,6 +3038,24 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType) c->getSema().InstantiateClassTemplateSpecialization(CTS->getBeginLoc(), CTS, TSK_ImplicitInstantiation, false); + if (!c->getSourceManager().isInSystemHeader(CTS->getBeginLoc())) + { + MultiLevelTemplateArgumentList templateArgs( + CTS->getTemplateInstantiationArgs()); + for (auto D : CTS->decls()) + { + if (D->getKind() == Decl::Kind::CXXRecord && !D->isImplicit()) + { + auto R = cast(D); + if (!R->isCompleteDefinition()) + { + c->getSema().InstantiateClass(R->getBeginLoc(), + R, R->getTemplateInstantiationPattern(), + templateArgs, TSK_ImplicitInstantiation, false); + } + } + } + } c->getSema().getDiagnostics().setClient(existingClient, false); @@ -3153,6 +3176,8 @@ void Parser::MarkValidity(Function* F) if (!FD->getTemplateInstantiationPattern() || !FD->isExternallyVisible()) return; + c->getSema().AnalysisWarnings.DefaultPolicy.disableCheckFallThrough(); + auto existingClient = c->getSema().getDiagnostics().getClient(); std::unique_ptr<::DiagnosticConsumer> SemaDiagnostics(new ::DiagnosticConsumer()); SemaDiagnostics->Decl = FD;