Author: Haojian Wu Date: 2020-07-02T14:58:32+02:00 New Revision: 8c5133f1855767a16a6045777bed4652bd114d84
URL: https://github.com/llvm/llvm-project/commit/8c5133f1855767a16a6045777bed4652bd114d84 DIFF: https://github.com/llvm/llvm-project/commit/8c5133f1855767a16a6045777bed4652bd114d84.diff LOG: [clang] Fix a null-NSS-access crash in DependentNameType. The DependentNameType must have a non-null NSS. This property could be violated during typo correction. Differential Revision: https://reviews.llvm.org/D82738 Added: Modified: clang/lib/Sema/SemaTemplate.cpp clang/test/Parser/cxx-template-decl.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 021fcd0f053a..c05ed0b14e3e 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4844,10 +4844,7 @@ bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, CXXScopeSpec SS; DeclarationNameInfo NameInfo; - if (DeclRefExpr *ArgExpr = dyn_cast<DeclRefExpr>(Arg.getAsExpr())) { - SS.Adopt(ArgExpr->getQualifierLoc()); - NameInfo = ArgExpr->getNameInfo(); - } else if (DependentScopeDeclRefExpr *ArgExpr = + if (DependentScopeDeclRefExpr *ArgExpr = dyn_cast<DependentScopeDeclRefExpr>(Arg.getAsExpr())) { SS.Adopt(ArgExpr->getQualifierLoc()); NameInfo = ArgExpr->getNameInfo(); @@ -4866,6 +4863,7 @@ bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, if (Result.getAsSingle<TypeDecl>() || Result.getResultKind() == LookupResult::NotFoundInCurrentInstantiation) { + assert(SS.getScopeRep() && "dependent scope expr must has a scope!"); // Suggest that the user add 'typename' before the NNS. SourceLocation Loc = AL.getSourceRange().getBegin(); Diag(Loc, getLangOpts().MSVCCompat diff --git a/clang/test/Parser/cxx-template-decl.cpp b/clang/test/Parser/cxx-template-decl.cpp index 64e7ca921f57..24cc13cde91f 100644 --- a/clang/test/Parser/cxx-template-decl.cpp +++ b/clang/test/Parser/cxx-template-decl.cpp @@ -286,3 +286,17 @@ namespace PR45239 { template<int> int b; template<int> auto f() -> b<0>; // expected-error +{{}} } + +namespace NoCrashOnNullNNSTypoCorrection { + +int AddObservation(); // expected-note {{declared here}} + +template <typename T, typename... Args> // expected-note {{template parameter is declared here}} +class UsingImpl {}; +class AddObservation { + using Using = + UsingImpl<AddObservationFn, const int>; // expected-error {{use of undeclared identifier 'AddObservationFn'; did you mean}} \ + expected-error {{template argument for template type parameter must be a type}} +}; + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits