Skip to content

Commit 4a6c038

Browse files
committed
[clang] support pack expansions for trailing requires clauses
This fixes a crash when evaluating constraints from trailing requires clauses, when these are part of a generic lambda which is expanded.
1 parent e25187b commit 4a6c038

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
@@ -373,6 +373,8 @@ Bug Fixes to C++ Support
373373
- Improved fix for an issue with pack expansions of type constraints, where this
374374
now also works if the constraint has non-type or template template parameters.
375375
(#GH131798)
376+
- Fix crash when evaluating the trailing requires clause of generic lambdas which are part of
377+
a pack expansion.
376378
- Fixes matching of nested template template parameters. (#GH130362)
377379
- Correctly diagnoses template template paramters which have a pack parameter
378380
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
@@ -2906,6 +2906,14 @@ class ASTContext : public RefCountedBase<ASTContext> {
29062906
/// that they may be used in declarations of the same template.
29072907
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
29082908

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

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() ||
@@ -2858,7 +2858,7 @@ class CXXDestructorDecl : public CXXMethodDecl {
28582858
const DeclarationNameInfo &NameInfo, QualType T,
28592859
TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline,
28602860
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2861-
Expr *TrailingRequiresClause = nullptr)
2861+
const AssociatedConstraint &TrailingRequiresClause = {})
28622862
: CXXMethodDecl(CXXDestructor, C, RD, StartLoc, NameInfo, T, TInfo,
28632863
SC_None, UsesFPIntrin, isInline, ConstexprKind,
28642864
SourceLocation(), TrailingRequiresClause) {
@@ -2873,7 +2873,7 @@ class CXXDestructorDecl : public CXXMethodDecl {
28732873
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
28742874
bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared,
28752875
ConstexprSpecKind ConstexprKind,
2876-
Expr *TrailingRequiresClause = nullptr);
2876+
const AssociatedConstraint &TrailingRequiresClause = {});
28772877
static CXXDestructorDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
28782878

28792879
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg);
@@ -2919,7 +2919,7 @@ class CXXConversionDecl : public CXXMethodDecl {
29192919
TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline,
29202920
ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind,
29212921
SourceLocation EndLocation,
2922-
Expr *TrailingRequiresClause = nullptr)
2922+
const AssociatedConstraint &TrailingRequiresClause = {})
29232923
: CXXMethodDecl(CXXConversion, C, RD, StartLoc, NameInfo, T, TInfo,
29242924
SC_None, UsesFPIntrin, isInline, ConstexprKind,
29252925
EndLocation, TrailingRequiresClause),
@@ -2937,7 +2937,7 @@ class CXXConversionDecl : public CXXMethodDecl {
29372937
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
29382938
bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES,
29392939
ConstexprSpecKind ConstexprKind, SourceLocation EndLocation,
2940-
Expr *TrailingRequiresClause = nullptr);
2940+
const AssociatedConstraint &TrailingRequiresClause = {});
29412941
static CXXConversionDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
29422942

29432943
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
@@ -8866,12 +8866,14 @@ class Sema final : public SemaBase {
88668866
CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
88678867
TemplateParameterList *TemplateParams);
88688868

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

88768878
/// Returns true if the explicit object parameter was invalid.
88778879
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)