[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
This revision was automatically updated to reflect the committed changes. Closed by commit rGd4a8c7359b57: [clang] Fix ICE on invalid type parameters for concepts (authored by mizvekov). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98095/new/ https://reviews.llvm.org/D98095 Files: clang/lib/Sema/SemaType.cpp clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp Index: clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp === --- clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp +++ clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp @@ -68,3 +68,11 @@ True decltype(auto) h = (b); static_assert(is_same_v); } + +namespace PR48593 { + template concept a = true; + a auto c = 0; // expected-error{{use of undeclared identifier 'B'}} + + template concept d = true; + d<,> auto e = 0; // expected-error{{expected expression}} +} Index: clang/lib/Sema/SemaType.cpp === --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -1256,25 +1256,6 @@ return OpenCLAccessAttr::Keyword_read_only; } -static QualType ConvertConstrainedAutoDeclSpecToType(Sema , DeclSpec , - 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 TemplateArgs; - for (auto : TemplateArgsInfo.arguments()) -TemplateArgs.push_back(ArgLoc.getArgument()); - return S.Context.getAutoType( - QualType(), AutoKW, false, /*IsPack=*/false, - cast(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 @@ 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 TemplateArgs; if (DS.isConstrainedAuto()) { - Result = ConvertConstrainedAutoDeclSpecToType(S, DS, -AutoTypeKeyword::Auto); - break; + if (TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId()) { +TypeConstraintConcept = +cast(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 : 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 @@ if (!DS.isConstrainedAuto()) return; TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); + if (!TemplateId) +return; if (DS.getTypeSpecScope().isNotEmpty()) TL.setNestedNameSpecifierLoc( DS.getTypeSpecScope().getWithLocInContext(Context)); ___ cfe-commits mailing list cfe-commits@lists.llvm.org
[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
mizvekov updated this revision to Diff 329149. mizvekov added a comment. Addressed rsmith's concerns. Fixed test type name to avoid picking up suggestions from other tests. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98095/new/ https://reviews.llvm.org/D98095 Files: clang/lib/Sema/SemaType.cpp clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp Index: clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp === --- clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp +++ clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp @@ -68,3 +68,11 @@ True decltype(auto) h = (b); static_assert(is_same_v); } + +namespace PR48593 { + template concept a = true; + a auto c = 0; // expected-error{{use of undeclared identifier 'B'}} + + template concept d = true; + d<,> auto e = 0; // expected-error{{expected expression}} +} Index: clang/lib/Sema/SemaType.cpp === --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -1256,25 +1256,6 @@ return OpenCLAccessAttr::Keyword_read_only; } -static QualType ConvertConstrainedAutoDeclSpecToType(Sema , DeclSpec , - 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 TemplateArgs; - for (auto : TemplateArgsInfo.arguments()) -TemplateArgs.push_back(ArgLoc.getArgument()); - return S.Context.getAutoType( - QualType(), AutoKW, false, /*IsPack=*/false, - cast(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 @@ 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 TemplateArgs; if (DS.isConstrainedAuto()) { - Result = ConvertConstrainedAutoDeclSpecToType(S, DS, -AutoTypeKeyword::Auto); - break; + if (TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId()) { +TypeConstraintConcept = +cast(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 : 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; @@ -5956,6 +5947,8 @@ if (!DS.isConstrainedAuto()) return; TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); + if (!TemplateId) +return; if (DS.getTypeSpecScope().isNotEmpty()) TL.setNestedNameSpecifierLoc( DS.getTypeSpecScope().getWithLocInContext(Context)); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
mizvekov added inline comments. Comment at: clang/lib/Sema/SemaType.cpp:5947-5948 TL.setNameLoc(DS.getTypeSpecTypeLoc()); if (!DS.isConstrainedAuto()) return; if (DS.getTypeSpecScope().isNotEmpty()) rsmith wrote: > Given that we recover from an invalid `TemplateId` by creating an > unconstrained `AutoType`, it would be more consistent to skip filling in the > `NestedNameSpecifierLoc` here in that case too. (That way, we would populate > the `NestedNameSpecifierLoc` if and only if we created a constrained > `AutoType`.) I think it doesn't matter right now because no-one should look > at this information for an unconstrained `AutoType`, but I could imagine we > would switch to storing smaller `TypeLoc` data in the future if the type is > unconstrained, and if we did, the writes to the `NestedNameSpecifierLoc` > below would break. Good catch, thanks! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98095/new/ https://reviews.llvm.org/D98095 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
rsmith added inline comments. Comment at: clang/lib/Sema/SemaType.cpp:1644-1661 +TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); +ConceptDecl *TypeConstraintConcept = nullptr; +llvm::SmallVector TemplateArgs; if (DS.isConstrainedAuto()) { - Result = ConvertConstrainedAutoDeclSpecToType(S, DS, -AutoTypeKeyword::Auto); - break; + if (TemplateId) { +TypeConstraintConcept = +cast(TemplateId->Template.get().getAsTemplateDecl()); Minor style nits: reduce scope of `TemplateId` variable and consistently brace the `else` if and only if the `if` is braced. Comment at: clang/lib/Sema/SemaType.cpp:5947-5948 TL.setNameLoc(DS.getTypeSpecTypeLoc()); if (!DS.isConstrainedAuto()) return; if (DS.getTypeSpecScope().isNotEmpty()) Given that we recover from an invalid `TemplateId` by creating an unconstrained `AutoType`, it would be more consistent to skip filling in the `NestedNameSpecifierLoc` here in that case too. (That way, we would populate the `NestedNameSpecifierLoc` if and only if we created a constrained `AutoType`.) I think it doesn't matter right now because no-one should look at this information for an unconstrained `AutoType`, but I could imagine we would switch to storing smaller `TypeLoc` data in the future if the type is unconstrained, and if we did, the writes to the `NestedNameSpecifierLoc` below would break. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98095/new/ https://reviews.llvm.org/D98095 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
mizvekov updated this revision to Diff 328919. mizvekov added a comment. Repush, no changes. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98095/new/ https://reviews.llvm.org/D98095 Files: clang/lib/Sema/SemaType.cpp clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp Index: clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp === --- clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp +++ clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp @@ -68,3 +68,11 @@ True decltype(auto) h = (b); static_assert(is_same_v); } + +namespace PR48593 { + template concept a = true; // expected-note{{template parameter is declared here}} + a auto c = 0; // expected-error{{template argument for template type parameter must be a type}} + + template concept d = true; + d<,> auto e = 0; // expected-error{{expected expression}} +} Index: clang/lib/Sema/SemaType.cpp === --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -1256,25 +1256,6 @@ return OpenCLAccessAttr::Keyword_read_only; } -static QualType ConvertConstrainedAutoDeclSpecToType(Sema , DeclSpec , - 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 TemplateArgs; - for (auto : TemplateArgsInfo.arguments()) -TemplateArgs.push_back(ArgLoc.getArgument()); - return S.Context.getAutoType( - QualType(), AutoKW, false, /*IsPack=*/false, - cast(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 @@ break; case DeclSpec::TST_auto: + case DeclSpec::TST_decltype_auto: { +auto AutoKW = DS.getTypeSpecType() == DeclSpec::TST_decltype_auto + ? AutoTypeKeyword::DecltypeAuto + : AutoTypeKeyword::Auto; + +TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); +ConceptDecl *TypeConstraintConcept = nullptr; +llvm::SmallVector TemplateArgs; if (DS.isConstrainedAuto()) { - Result = ConvertConstrainedAutoDeclSpecToType(S, DS, -AutoTypeKeyword::Auto); - break; + if (TemplateId) { +TypeConstraintConcept = +cast(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 (auto : 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; @@ -5955,15 +5946,17 @@ TL.setNameLoc(DS.getTypeSpecTypeLoc()); if (!DS.isConstrainedAuto()) return; - TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); if (DS.getTypeSpecScope().isNotEmpty()) TL.setNestedNameSpecifierLoc( DS.getTypeSpecScope().getWithLocInContext(Context)); else TL.setNestedNameSpecifierLoc(NestedNameSpecifierLoc()); + TL.setFoundDecl(nullptr); + TemplateIdAnnotation
[PATCH] D98095: [clang] Fix ICE on invalid type parameters for concepts
mizvekov created this revision. mizvekov requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. See PR48593. Constraints with invalid type parameters were causing a null pointer dereference. Signed-off-by: Matheus Izvekov Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D98095 Files: clang/lib/Sema/SemaType.cpp clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp Index: clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp === --- clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp +++ clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp @@ -68,3 +68,11 @@ True decltype(auto) h = (b); static_assert(is_same_v); } + +namespace PR48593 { + template concept a = true; // expected-note{{template parameter is declared here}} + a auto c = 0; // expected-error{{template argument for template type parameter must be a type}} + + template concept d = true; + d<,> auto e = 0; // expected-error{{expected expression}} +} Index: clang/lib/Sema/SemaType.cpp === --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -1256,25 +1256,6 @@ return OpenCLAccessAttr::Keyword_read_only; } -static QualType ConvertConstrainedAutoDeclSpecToType(Sema , DeclSpec , - 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 TemplateArgs; - for (auto : TemplateArgsInfo.arguments()) -TemplateArgs.push_back(ArgLoc.getArgument()); - return S.Context.getAutoType( - QualType(), AutoKW, false, /*IsPack=*/false, - cast(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 @@ break; case DeclSpec::TST_auto: + case DeclSpec::TST_decltype_auto: { +auto AutoKW = DS.getTypeSpecType() == DeclSpec::TST_decltype_auto + ? AutoTypeKeyword::DecltypeAuto + : AutoTypeKeyword::Auto; + +TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); +ConceptDecl *TypeConstraintConcept = nullptr; +llvm::SmallVector TemplateArgs; if (DS.isConstrainedAuto()) { - Result = ConvertConstrainedAutoDeclSpecToType(S, DS, -AutoTypeKeyword::Auto); - break; + if (TemplateId) { +TypeConstraintConcept = +cast(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 (auto : 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; @@ -5955,15 +5946,17 @@ TL.setNameLoc(DS.getTypeSpecTypeLoc()); if (!DS.isConstrainedAuto()) return; - TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId(); if (DS.getTypeSpecScope().isNotEmpty()) TL.setNestedNameSpecifierLoc( DS.getTypeSpecScope().getWithLocInContext(Context)); else