[clang] d4a8c73 - [clang] Fix ICE on invalid type parameters for concepts
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 12 16:23:10 PST 2021
Author: Matheus Izvekov
Date: 2021-03-13T01:23:02+01:00
New Revision: d4a8c7359b57bafc7bfa2a9dea30017fb0153c1a
URL: https://github.com/llvm/llvm-project/commit/d4a8c7359b57bafc7bfa2a9dea30017fb0153c1a
DIFF: https://github.com/llvm/llvm-project/commit/d4a8c7359b57bafc7bfa2a9dea30017fb0153c1a.diff
LOG: [clang] Fix ICE on invalid type parameters for concepts
See PR48593.
Constraints with invalid type parameters were causing a null pointer
dereference.
Signed-off-by: Matheus Izvekov <mizvekov at gmail.com>
Reviewed By: rsmith
Differential Revision: https://reviews.llvm.org/D98095
Added:
Modified:
clang/lib/Sema/SemaType.cpp
clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 5f5b0361eab5..ffd431608b82 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1256,25 +1256,6 @@ getImageAccess(const ParsedAttributesView &Attrs) {
return OpenCLAccessAttr::Keyword_read_only;
}
-static QualType ConvertConstrainedAutoDeclSpecToType(Sema &S, DeclSpec &DS,
- AutoTypeKeyword AutoKW) {
- assert(DS.isConstrainedAuto());
- TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId();
- TemplateArgumentListInfo TemplateArgsInfo;
- TemplateArgsInfo.setLAngleLoc(TemplateId->LAngleLoc);
- TemplateArgsInfo.setRAngleLoc(TemplateId->RAngleLoc);
- ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
- TemplateId->NumArgs);
- S.translateTemplateArguments(TemplateArgsPtr, TemplateArgsInfo);
- llvm::SmallVector<TemplateArgument, 8> TemplateArgs;
- for (auto &ArgLoc : TemplateArgsInfo.arguments())
- TemplateArgs.push_back(ArgLoc.getArgument());
- return S.Context.getAutoType(
- QualType(), AutoKW, false, /*IsPack=*/false,
- cast<ConceptDecl>(TemplateId->Template.get().getAsTemplateDecl()),
- TemplateArgs);
-}
-
/// Convert the specified declspec to the appropriate type
/// object.
/// \param state Specifies the declarator containing the declaration specifier
@@ -1655,29 +1636,39 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
break;
case DeclSpec::TST_auto:
+ case DeclSpec::TST_decltype_auto: {
+ auto AutoKW = DS.getTypeSpecType() == DeclSpec::TST_decltype_auto
+ ? AutoTypeKeyword::DecltypeAuto
+ : AutoTypeKeyword::Auto;
+
+ ConceptDecl *TypeConstraintConcept = nullptr;
+ llvm::SmallVector<TemplateArgument, 8> TemplateArgs;
if (DS.isConstrainedAuto()) {
- Result = ConvertConstrainedAutoDeclSpecToType(S, DS,
- AutoTypeKeyword::Auto);
- break;
+ if (TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId()) {
+ TypeConstraintConcept =
+ cast<ConceptDecl>(TemplateId->Template.get().getAsTemplateDecl());
+ TemplateArgumentListInfo TemplateArgsInfo;
+ TemplateArgsInfo.setLAngleLoc(TemplateId->LAngleLoc);
+ TemplateArgsInfo.setRAngleLoc(TemplateId->RAngleLoc);
+ ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
+ TemplateId->NumArgs);
+ S.translateTemplateArguments(TemplateArgsPtr, TemplateArgsInfo);
+ for (const auto &ArgLoc : TemplateArgsInfo.arguments())
+ TemplateArgs.push_back(ArgLoc.getArgument());
+ } else {
+ declarator.setInvalidType(true);
+ }
}
- Result = Context.getAutoType(QualType(), AutoTypeKeyword::Auto, false);
+ Result = S.Context.getAutoType(QualType(), AutoKW,
+ /*IsDependent*/ false, /*IsPack=*/false,
+ TypeConstraintConcept, TemplateArgs);
break;
+ }
case DeclSpec::TST_auto_type:
Result = Context.getAutoType(QualType(), AutoTypeKeyword::GNUAutoType, false);
break;
- case DeclSpec::TST_decltype_auto:
- if (DS.isConstrainedAuto()) {
- Result =
- ConvertConstrainedAutoDeclSpecToType(S, DS,
- AutoTypeKeyword::DecltypeAuto);
- break;
- }
- Result = Context.getAutoType(QualType(), AutoTypeKeyword::DecltypeAuto,
- /*IsDependent*/ false);
- break;
-
case DeclSpec::TST_unknown_anytype:
Result = Context.UnknownAnyTy;
break;
@@ -5962,6 +5953,8 @@ namespace {
if (!DS.isConstrainedAuto())
return;
TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId();
+ if (!TemplateId)
+ return;
if (DS.getTypeSpecScope().isNotEmpty())
TL.setNestedNameSpecifierLoc(
DS.getTypeSpecScope().getWithLocInContext(Context));
diff --git a/clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp b/clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp
index 44539bd125ff..7830d1f43526 100644
--- a/clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp
+++ b/clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp
@@ -68,3 +68,11 @@ namespace PR48384 {
True decltype(auto) h = (b);
static_assert(is_same_v<decltype(h), int&>);
}
+
+namespace PR48593 {
+ template <class T, class U> concept a = true;
+ a<B> auto c = 0; // expected-error{{use of undeclared identifier 'B'}}
+
+ template<class> concept d = true;
+ d<,> auto e = 0; // expected-error{{expected expression}}
+}
More information about the cfe-commits
mailing list