Skip to content

Commit 49fd0bf

Browse files
authored
[clang] support pack expansions for trailing requires clauses (#133190)
1 parent c1ada72 commit 49fd0bf

32 files changed

+204
-133
lines changed

clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ computeReferencedDecls(const clang::Expr *Expr) {
100100
TraverseLambdaCapture(LExpr, &Capture, Initializer);
101101
}
102102

103-
if (clang::Expr *const RequiresClause =
104-
LExpr->getTrailingRequiresClause()) {
105-
TraverseStmt(RequiresClause);
103+
if (const clang::Expr *RequiresClause =
104+
LExpr->getTrailingRequiresClause().ConstraintExpr) {
105+
TraverseStmt(const_cast<clang::Expr *>(RequiresClause));
106106
}
107107

108108
for (auto *const TemplateParam : LExpr->getExplicitTemplateParameters())

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,8 @@ Bug Fixes to C++ Support
385385
- Improved fix for an issue with pack expansions of type constraints, where this
386386
now also works if the constraint has non-type or template template parameters.
387387
(#GH131798)
388+
- Fix crash when evaluating the trailing requires clause of generic lambdas which are part of
389+
a pack expansion.
388390
- Fixes matching of nested template template parameters. (#GH130362)
389391
- Correctly diagnoses template template paramters which have a pack parameter
390392
not in the last position.

clang/include/clang/AST/ASTContext.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,6 +2907,14 @@ class ASTContext : public RefCountedBase<ASTContext> {
29072907
/// that they may be used in declarations of the same template.
29082908
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
29092909

2910+
/// Determine whether two 'requires' expressions are similar enough that they
2911+
/// may be used in re-declarations.
2912+
///
2913+
/// Use of 'requires' isn't mandatory, works with constraints expressed in
2914+
/// other ways too.
2915+
bool isSameAssociatedConstraint(const AssociatedConstraint &ACX,
2916+
const AssociatedConstraint &ACY) const;
2917+
29102918
/// Determine whether two 'requires' expressions are similar enough that they
29112919
/// may be used in re-declarations.
29122920
///

clang/include/clang/AST/ASTNodeTraverser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,8 @@ class ASTNodeTraverser
538538
for (const auto *Parameter : D->parameters())
539539
Visit(Parameter);
540540

541-
if (const Expr *TRC = D->getTrailingRequiresClause())
542-
Visit(TRC);
541+
if (const AssociatedConstraint &TRC = D->getTrailingRequiresClause())
542+
Visit(TRC.ConstraintExpr);
543543

544544
if (Traversal == TK_IgnoreUnlessSpelledInSource && D->isDefaulted())
545545
return;

clang/include/clang/AST/Decl.h

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,19 @@ enum class ImplicitParamKind;
8181
// Holds a constraint expression along with a pack expansion index, if
8282
// expanded.
8383
struct AssociatedConstraint {
84-
const Expr *ConstraintExpr;
85-
int ArgumentPackSubstitutionIndex;
84+
const Expr *ConstraintExpr = nullptr;
85+
int ArgumentPackSubstitutionIndex = -1;
86+
87+
constexpr AssociatedConstraint() = default;
8688

8789
explicit AssociatedConstraint(const Expr *ConstraintExpr,
8890
int ArgumentPackSubstitutionIndex = -1)
8991
: ConstraintExpr(ConstraintExpr),
9092
ArgumentPackSubstitutionIndex(ArgumentPackSubstitutionIndex) {}
93+
94+
explicit operator bool() const { return ConstraintExpr != nullptr; }
95+
96+
bool isNull() const { return !operator bool(); }
9197
};
9298

9399
/// The top declaration context.
@@ -754,7 +760,7 @@ class DeclaratorDecl : public ValueDecl {
754760
// and constrained function decls.
755761
struct ExtInfo : public QualifierInfo {
756762
TypeSourceInfo *TInfo = nullptr;
757-
Expr *TrailingRequiresClause = nullptr;
763+
AssociatedConstraint TrailingRequiresClause;
758764
};
759765

760766
llvm::PointerUnion<TypeSourceInfo *, ExtInfo *> DeclInfo;
@@ -823,17 +829,12 @@ class DeclaratorDecl : public ValueDecl {
823829
/// \brief Get the constraint-expression introduced by the trailing
824830
/// requires-clause in the function/member declaration, or null if no
825831
/// requires-clause was provided.
826-
Expr *getTrailingRequiresClause() {
827-
return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
828-
: nullptr;
829-
}
830-
831-
const Expr *getTrailingRequiresClause() const {
832-
return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
833-
: nullptr;
832+
const AssociatedConstraint &getTrailingRequiresClause() const {
833+
static constexpr AssociatedConstraint Null;
834+
return hasExtInfo() ? getExtInfo()->TrailingRequiresClause : Null;
834835
}
835836

836-
void setTrailingRequiresClause(Expr *TrailingRequiresClause);
837+
void setTrailingRequiresClause(const AssociatedConstraint &AC);
837838

838839
unsigned getNumTemplateParameterLists() const {
839840
return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
@@ -2102,7 +2103,7 @@ class FunctionDecl : public DeclaratorDecl,
21022103
const DeclarationNameInfo &NameInfo, QualType T,
21032104
TypeSourceInfo *TInfo, StorageClass S, bool UsesFPIntrin,
21042105
bool isInlineSpecified, ConstexprSpecKind ConstexprKind,
2105-
Expr *TrailingRequiresClause = nullptr);
2106+
const AssociatedConstraint &TrailingRequiresClause);
21062107

21072108
using redeclarable_base = Redeclarable<FunctionDecl>;
21082109

@@ -2138,7 +2139,7 @@ class FunctionDecl : public DeclaratorDecl,
21382139
TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin = false,
21392140
bool isInlineSpecified = false, bool hasWrittenPrototype = true,
21402141
ConstexprSpecKind ConstexprKind = ConstexprSpecKind::Unspecified,
2141-
Expr *TrailingRequiresClause = nullptr) {
2142+
const AssociatedConstraint &TrailingRequiresClause = {}) {
21422143
DeclarationNameInfo NameInfo(N, NLoc);
21432144
return FunctionDecl::Create(C, DC, StartLoc, NameInfo, T, TInfo, SC,
21442145
UsesFPIntrin, isInlineSpecified,
@@ -2151,7 +2152,7 @@ class FunctionDecl : public DeclaratorDecl,
21512152
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
21522153
StorageClass SC, bool UsesFPIntrin, bool isInlineSpecified,
21532154
bool hasWrittenPrototype, ConstexprSpecKind ConstexprKind,
2154-
Expr *TrailingRequiresClause);
2155+
const AssociatedConstraint &TrailingRequiresClause);
21552156

21562157
static FunctionDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
21572158

@@ -2644,9 +2645,9 @@ class FunctionDecl : public DeclaratorDecl,
26442645
/// Use this instead of getTrailingRequiresClause for concepts APIs that
26452646
/// accept an ArrayRef of constraint expressions.
26462647
void
2647-
getAssociatedConstraints(SmallVectorImpl<AssociatedConstraint> &AC) const {
2648-
if (auto *TRC = getTrailingRequiresClause())
2649-
AC.emplace_back(TRC);
2648+
getAssociatedConstraints(SmallVectorImpl<AssociatedConstraint> &ACs) const {
2649+
if (const AssociatedConstraint &AC = getTrailingRequiresClause())
2650+
ACs.emplace_back(AC);
26502651
}
26512652

26522653
/// Get the message that indicates why this function was deleted.

clang/include/clang/AST/DeclCXX.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ class CXXDeductionGuideDecl : public FunctionDecl {
19741974
const DeclarationNameInfo &NameInfo, QualType T,
19751975
TypeSourceInfo *TInfo, SourceLocation EndLocation,
19761976
CXXConstructorDecl *Ctor, DeductionCandidate Kind,
1977-
Expr *TrailingRequiresClause,
1977+
const AssociatedConstraint &TrailingRequiresClause,
19781978
const CXXDeductionGuideDecl *GeneratedFrom,
19791979
SourceDeductionGuideKind SourceKind)
19801980
: FunctionDecl(CXXDeductionGuide, C, DC, StartLoc, NameInfo, T, TInfo,
@@ -2007,7 +2007,7 @@ class CXXDeductionGuideDecl : public FunctionDecl {
20072007
TypeSourceInfo *TInfo, SourceLocation EndLocation,
20082008
CXXConstructorDecl *Ctor = nullptr,
20092009
DeductionCandidate Kind = DeductionCandidate::Normal,
2010-
Expr *TrailingRequiresClause = nullptr,
2010+
const AssociatedConstraint &TrailingRequiresClause = {},
20112011
const CXXDeductionGuideDecl *SourceDG = nullptr,
20122012
SourceDeductionGuideKind SK = SourceDeductionGuideKind::None);
20132013

@@ -2115,7 +2115,7 @@ class CXXMethodDecl : public FunctionDecl {
21152115
QualType T, TypeSourceInfo *TInfo, StorageClass SC,
21162116
bool UsesFPIntrin, bool isInline,
21172117
ConstexprSpecKind ConstexprKind, SourceLocation EndLocation,
2118-
Expr *TrailingRequiresClause = nullptr)
2118+
const AssociatedConstraint &TrailingRequiresClause = {})
21192119
: FunctionDecl(DK, C, RD, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
21202120
isInline, ConstexprKind, TrailingRequiresClause) {
21212121
if (EndLocation.isValid())
@@ -2128,7 +2128,7 @@ class CXXMethodDecl : public FunctionDecl {
21282128
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
21292129
StorageClass SC, bool UsesFPIntrin, bool isInline,
21302130
ConstexprSpecKind ConstexprKind, SourceLocation EndLocation,
2131-
Expr *TrailingRequiresClause = nullptr);
2131+
const AssociatedConstraint &TrailingRequiresClause = {});
21322132

21332133
static CXXMethodDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
21342134

@@ -2596,7 +2596,7 @@ class CXXConstructorDecl final
25962596
bool UsesFPIntrin, bool isInline,
25972597
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
25982598
InheritedConstructor Inherited,
2599-
Expr *TrailingRequiresClause);
2599+
const AssociatedConstraint &TrailingRequiresClause);
26002600

26012601
void anchor() override;
26022602

@@ -2639,7 +2639,7 @@ class CXXConstructorDecl final
26392639
ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline,
26402640
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
26412641
InheritedConstructor Inherited = InheritedConstructor(),
2642-
Expr *TrailingRequiresClause = nullptr);
2642+
const AssociatedConstraint &TrailingRequiresClause = {});
26432643

26442644
void setExplicitSpecifier(ExplicitSpecifier ES) {
26452645
assert((!ES.getExpr() ||
@@ -2859,7 +2859,7 @@ class CXXDestructorDecl : public CXXMethodDecl {
28592859
const DeclarationNameInfo &NameInfo, QualType T,
28602860
TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline,
28612861
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2862-
Expr *TrailingRequiresClause = nullptr)
2862+
const AssociatedConstraint &TrailingRequiresClause = {})
28632863
: CXXMethodDecl(CXXDestructor, C, RD, StartLoc, NameInfo, T, TInfo,
28642864
SC_None, UsesFPIntrin, isInline, ConstexprKind,
28652865
SourceLocation(), TrailingRequiresClause) {
@@ -2874,7 +2874,7 @@ class CXXDestructorDecl : public CXXMethodDecl {
28742874
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
28752875
bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared,
28762876
ConstexprSpecKind ConstexprKind,
2877-
Expr *TrailingRequiresClause = nullptr);
2877+
const AssociatedConstraint &TrailingRequiresClause = {});
28782878
static CXXDestructorDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
28792879

28802880
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg);
@@ -2925,7 +2925,7 @@ class CXXConversionDecl : public CXXMethodDecl {
29252925
TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline,
29262926
ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind,
29272927
SourceLocation EndLocation,
2928-
Expr *TrailingRequiresClause = nullptr)
2928+
const AssociatedConstraint &TrailingRequiresClause = {})
29292929
: CXXMethodDecl(CXXConversion, C, RD, StartLoc, NameInfo, T, TInfo,
29302930
SC_None, UsesFPIntrin, isInline, ConstexprKind,
29312931
EndLocation, TrailingRequiresClause),
@@ -2943,7 +2943,7 @@ class CXXConversionDecl : public CXXMethodDecl {
29432943
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
29442944
bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES,
29452945
ConstexprSpecKind ConstexprKind, SourceLocation EndLocation,
2946-
Expr *TrailingRequiresClause = nullptr);
2946+
const AssociatedConstraint &TrailingRequiresClause = {});
29472947
static CXXConversionDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
29482948

29492949
ExplicitSpecifier getExplicitSpecifier() {

clang/include/clang/AST/ExprCXX.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2129,7 +2129,7 @@ class LambdaExpr final : public Expr,
21292129
ArrayRef<NamedDecl *> getExplicitTemplateParameters() const;
21302130

21312131
/// Get the trailing requires clause, if any.
2132-
Expr *getTrailingRequiresClause() const;
2132+
const AssociatedConstraint &getTrailingRequiresClause() const;
21332133

21342134
/// Whether this is a generic lambda.
21352135
bool isGenericLambda() const { return getTemplateParameterList(); }

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,8 +2253,10 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
22532253
}
22542254

22552255
// Visit the trailing requires clause, if any.
2256-
if (Expr *TrailingRequiresClause = D->getTrailingRequiresClause()) {
2257-
TRY_TO(TraverseStmt(TrailingRequiresClause));
2256+
if (const AssociatedConstraint &TrailingRequiresClause =
2257+
D->getTrailingRequiresClause()) {
2258+
TRY_TO(TraverseStmt(
2259+
const_cast<Expr *>(TrailingRequiresClause.ConstraintExpr)));
22582260
}
22592261

22602262
if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
@@ -2768,7 +2770,8 @@ DEF_TRAVERSE_STMT(LambdaExpr, {
27682770

27692771
if (S->hasExplicitResultType())
27702772
TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2771-
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getTrailingRequiresClause());
2773+
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(
2774+
const_cast<Expr *>(S->getTrailingRequiresClause().ConstraintExpr));
27722775

27732776
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
27742777
}

clang/include/clang/Sema/Sema.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8867,12 +8867,14 @@ class Sema final : public SemaBase {
88678867
CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
88688868
TemplateParameterList *TemplateParams);
88698869

8870-
void CompleteLambdaCallOperator(
8871-
CXXMethodDecl *Method, SourceLocation LambdaLoc,
8872-
SourceLocation CallOperatorLoc, Expr *TrailingRequiresClause,
8873-
TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind,
8874-
StorageClass SC, ArrayRef<ParmVarDecl *> Params,
8875-
bool HasExplicitResultType);
8870+
void
8871+
CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc,
8872+
SourceLocation CallOperatorLoc,
8873+
const AssociatedConstraint &TrailingRequiresClause,
8874+
TypeSourceInfo *MethodTyInfo,
8875+
ConstexprSpecKind ConstexprKind, StorageClass SC,
8876+
ArrayRef<ParmVarDecl *> Params,
8877+
bool HasExplicitResultType);
88768878

88778879
/// Returns true if the explicit object parameter was invalid.
88788880
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method,

clang/lib/AST/ASTContext.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7070,6 +7070,15 @@ bool ASTContext::hasSameTemplateName(const TemplateName &X,
70707070
getCanonicalTemplateName(Y, IgnoreDeduced);
70717071
}
70727072

7073+
bool ASTContext::isSameAssociatedConstraint(
7074+
const AssociatedConstraint &ACX, const AssociatedConstraint &ACY) const {
7075+
if (ACX.ArgumentPackSubstitutionIndex != ACY.ArgumentPackSubstitutionIndex)
7076+
return false;
7077+
if (!isSameConstraintExpr(ACX.ConstraintExpr, ACY.ConstraintExpr))
7078+
return false;
7079+
return true;
7080+
}
7081+
70737082
bool ASTContext::isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const {
70747083
if (!XCE != !YCE)
70757084
return false;
@@ -7386,8 +7395,8 @@ bool ASTContext::isSameEntity(const NamedDecl *X, const NamedDecl *Y) const {
73867395
return false;
73877396
}
73887397

7389-
if (!isSameConstraintExpr(FuncX->getTrailingRequiresClause(),
7390-
FuncY->getTrailingRequiresClause()))
7398+
if (!isSameAssociatedConstraint(FuncX->getTrailingRequiresClause(),
7399+
FuncY->getTrailingRequiresClause()))
73917400
return false;
73927401

73937402
auto GetTypeAsWritten = [](const FunctionDecl *FD) {

clang/lib/AST/ASTImporter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3915,8 +3915,9 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
39153915
auto ToEndLoc = importChecked(Err, D->getEndLoc());
39163916
auto ToDefaultLoc = importChecked(Err, D->getDefaultLoc());
39173917
auto ToQualifierLoc = importChecked(Err, D->getQualifierLoc());
3918-
auto TrailingRequiresClause =
3919-
importChecked(Err, D->getTrailingRequiresClause());
3918+
AssociatedConstraint TrailingRequiresClause = D->getTrailingRequiresClause();
3919+
TrailingRequiresClause.ConstraintExpr =
3920+
importChecked(Err, TrailingRequiresClause.ConstraintExpr);
39203921
if (Err)
39213922
return std::move(Err);
39223923

clang/lib/AST/Decl.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,8 +2009,8 @@ void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) {
20092009
}
20102010
}
20112011

2012-
void DeclaratorDecl::setTrailingRequiresClause(Expr *TrailingRequiresClause) {
2013-
assert(TrailingRequiresClause);
2012+
void DeclaratorDecl::setTrailingRequiresClause(const AssociatedConstraint &AC) {
2013+
assert(AC);
20142014
// Make sure the extended decl info is allocated.
20152015
if (!hasExtInfo()) {
20162016
// Save (non-extended) type source info pointer.
@@ -2021,7 +2021,7 @@ void DeclaratorDecl::setTrailingRequiresClause(Expr *TrailingRequiresClause) {
20212021
getExtInfo()->TInfo = savedTInfo;
20222022
}
20232023
// Set requires clause info.
2024-
getExtInfo()->TrailingRequiresClause = TrailingRequiresClause;
2024+
getExtInfo()->TrailingRequiresClause = AC;
20252025
}
20262026

20272027
void DeclaratorDecl::setTemplateParameterListsInfo(
@@ -3047,7 +3047,7 @@ FunctionDecl::FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC,
30473047
TypeSourceInfo *TInfo, StorageClass S,
30483048
bool UsesFPIntrin, bool isInlineSpecified,
30493049
ConstexprSpecKind ConstexprKind,
3050-
Expr *TrailingRequiresClause)
3050+
const AssociatedConstraint &TrailingRequiresClause)
30513051
: DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,
30523052
StartLoc),
30533053
DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),
@@ -3571,7 +3571,7 @@ bool FunctionDecl::isMemberLikeConstrainedFriend() const {
35713571
// If these friends don't have constraints, they aren't constrained, and
35723572
// thus don't fall under temp.friend p9. Else the simple presence of a
35733573
// constraint makes them unique.
3574-
return getTrailingRequiresClause();
3574+
return !getTrailingRequiresClause().isNull();
35753575
}
35763576

35773577
return FriendConstraintRefersToEnclosingTemplate();
@@ -5453,7 +5453,7 @@ FunctionDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
54535453
TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
54545454
bool isInlineSpecified, bool hasWrittenPrototype,
54555455
ConstexprSpecKind ConstexprKind,
5456-
Expr *TrailingRequiresClause) {
5456+
const AssociatedConstraint &TrailingRequiresClause) {
54575457
FunctionDecl *New = new (C, DC) FunctionDecl(
54585458
Function, C, DC, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
54595459
isInlineSpecified, ConstexprKind, TrailingRequiresClause);
@@ -5464,7 +5464,8 @@ FunctionDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
54645464
FunctionDecl *FunctionDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
54655465
return new (C, ID) FunctionDecl(
54665466
Function, C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(),
5467-
nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified, nullptr);
5467+
nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified,
5468+
/*TrailingRequiresClause=*/{});
54685469
}
54695470

54705471
BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {

0 commit comments

Comments
 (0)