Skip to content

Commit 4a0d17c

Browse files
committed
Fix profiling of pack indexing expressions
1 parent 236754c commit 4a0d17c

File tree

3 files changed

+62
-36
lines changed

3 files changed

+62
-36
lines changed

clang/include/clang/AST/ExprCXX.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4592,6 +4592,10 @@ class PackIndexingExpr final
45924592
return {getTrailingObjects<Expr *>(), TransformedExpressions};
45934593
}
45944594

4595+
bool isPartiallySubstituted() const {
4596+
return isValueDependent() && TransformedExpressions;
4597+
};
4598+
45954599
static bool classof(const Stmt *T) {
45964600
return T->getStmtClass() == PackIndexingExprClass;
45974601
}

clang/lib/AST/StmtProfile.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2291,9 +2291,15 @@ void StmtProfiler::VisitSizeOfPackExpr(const SizeOfPackExpr *S) {
22912291
}
22922292

22932293
void StmtProfiler::VisitPackIndexingExpr(const PackIndexingExpr *E) {
2294-
VisitExpr(E);
2295-
VisitExpr(E->getPackIdExpression());
22962294
VisitExpr(E->getIndexExpr());
2295+
2296+
if (E->isPartiallySubstituted()) {
2297+
ID.AddInteger(E->getExpressions().size());
2298+
for (const Expr *Sub : E->getExpressions())
2299+
Visit(Sub);
2300+
} else {
2301+
VisitExpr(E->getPackIdExpression());
2302+
}
22972303
}
22982304

22992305
void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(

clang/test/SemaTemplate/concepts-out-of-line-def.cpp

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -785,55 +785,71 @@ consteval void S::mfn() requires (bool(&fn)) {}
785785

786786
namespace GH138255 {
787787

788-
template <typename... T>
789-
concept C = true;
790-
791-
struct Func {
792-
template<typename... Ts>
793-
requires C<Ts...[0]>
794-
static auto buggy() -> void;
795-
796-
template<typename... Ts>
797-
requires C<Ts...[0]>
798-
friend auto fr() -> void;
799-
800-
template<typename... Ts>
801-
requires C<Ts...[0]>
802-
friend auto fr2() -> void{}; // expected-note{{previous definition is here}}
803-
};
788+
template <typename... T>
789+
concept C = true;
804790

791+
struct Func {
805792
template<typename... Ts>
806793
requires C<Ts...[0]>
807-
auto Func::buggy() -> void {}
794+
static auto buggy() -> void;
808795

809796
template<typename... Ts>
810797
requires C<Ts...[0]>
811-
auto fr() -> void {}
798+
friend auto fr() -> void;
812799

813800
template<typename... Ts>
814801
requires C<Ts...[0]>
815-
auto fr2() -> void {} // expected-error{{redefinition of 'fr2'}}
802+
friend auto fr2() -> void{}; // expected-note{{previous definition is here}}
803+
};
816804

805+
template<typename... Ts>
806+
requires C<Ts...[0]>
807+
auto Func::buggy() -> void {}
817808

818-
template <typename... Ts>
819-
requires C<Ts...[0]>
820-
struct Class;
809+
template<typename... Ts>
810+
requires C<Ts...[0]>
811+
auto fr() -> void {}
821812

822-
template <typename... Ts>
823-
requires C<Ts...[0]>
824-
struct Class;
813+
template<typename... Ts>
814+
requires C<Ts...[0]>
815+
auto fr2() -> void {} // expected-error{{redefinition of 'fr2'}}
825816

826817

827-
template <typename...>
828-
struct TplClass {
829-
template<typename... Ts>
830-
requires C<Ts...[0]>
831-
static auto buggy() -> void;
832-
};
818+
template <typename... Ts>
819+
requires C<Ts...[0]>
820+
struct Class;
821+
822+
template <typename... Ts>
823+
requires C<Ts...[0]>
824+
struct Class;
825+
833826

834-
template<>
827+
template <typename...>
828+
struct TplClass {
835829
template<typename... Ts>
836830
requires C<Ts...[0]>
837-
auto TplClass<int>::buggy() -> void {}
831+
static auto buggy() -> void;
832+
};
838833

839-
}
834+
template<>
835+
template<typename... Ts>
836+
requires C<Ts...[0]>
837+
auto TplClass<int>::buggy() -> void {}
838+
839+
}
840+
841+
namespace PackIndexExpr {
842+
template <int... T>
843+
concept C = true;
844+
845+
template <typename...> struct TplClass {
846+
template <int... Ts>
847+
requires C<Ts...[0]>
848+
static auto buggy() -> void;
849+
};
850+
851+
template <>
852+
template <int... Ts>
853+
requires C<Ts...[0]>
854+
auto TplClass<int>::buggy() -> void {}
855+
}

0 commit comments

Comments
 (0)