| Issue |
177245
|
| Summary |
[clang] Assertion failure in `Sema::getPackSubstitutedTemplateArgument` during constraint checking (ArrayRef OOB)
|
| Labels |
|
| Assignees |
|
| Reporter |
matt-gb
|
https://godbolt.org/z/YKoe6vv9M
This code crashes clang 22 in C++26 mode (`-std=c++2c` or `-std=c++26`). Seen with clang 22.1.0-rc1 (built locally from 8164f1a) and godbolt's clang-trunk. Release builds segfault, assertion-enabled builds hit a bounds check in `ArrayRef.h`.
Clang 21.1.0 and GCC 15.2 both accept it with no warnings.
Bisected to e9972de (#161671).
#### Repro (reduced from some code in stdexec 24.09):
```cpp
// crash.cpp
template <class _Fun, class... _As>
concept __callable = requires (_Fun __fun, _As...) { __fun(); };
template <class... _Args>
struct __mdispatch {
template <class... _Ts>
requires (__callable<_Args, _Ts...> && ...)
void operator()();
};
static_assert(!__callable<__mdispatch<int>>);
```
```bash
clang-22 -std=c++26 -fsyntax-only crash.cpp # No crash with -std=c++23/2b
```
#### Clang 22.1.0-rc1 built with options:
```
cmake -S llvm -B build-debug-rc1 -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_C_COMPILER=/usr/bin/clang-19 \
-DCMAKE_CXX_COMPILER=/usr/bin/clang++-19 \
-DLLVM_ENABLE_PROJECTS=clang \
-DLLVM_TARGETS_TO_BUILD=X86
```
#### Crash output:
<details>
```bash
clang: /llvm-project/llvm/include/llvm/ADT/ArrayRef.h:248: const T &llvm::ArrayRef<clang::TemplateArgument>::operator[](size_t) const [T = clang::TemplateArgument]: Assertion `Index < Length && "Invalid index!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: /llvm-project/build-debug-rc1/bin/clang -std=c++26 -fsyntax-only crash.cpp
1. crash.cpp:11:44: current parser token ')'
#0 0x000000000379588d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:842:11
#1 0x0000000003795dbb PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:924:1
#2 0x0000000003793c74 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:108:5
#3 0x000000000379517e llvm::sys::CleanupOnSignal(unsigned long) /llvm-project/llvm/lib/Support/Unix/Signals.inc:377:1
#4 0x00000000036b94e2 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:0:7
#5 0x00000000036b9896 CrashRecoverySignalHandler(int) /llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:391:1
#6 0x00007f6a26c3ebf0 __restore_rt (/lib64/libc.so.6+0x3ebf0)
#7 0x00007f6a26c8bedc __pthread_kill_implementation (/lib64/libc.so.6+0x8bedc)
#8 0x00007f6a26c3eb46 gsignal (/lib64/libc.so.6+0x3eb46)
#9 0x00007f6a26c28833 abort (/lib64/libc.so.6+0x28833)
#10 0x00007f6a26c2875b _nl_load_domain.cold (/lib64/libc.so.6+0x2875b)
#11 0x00007f6a26c37886 (/lib64/libc.so.6+0x37886)
#12 0x0000000003b1cf48 llvm::ArrayRef<clang::TemplateArgument>::operator[](unsigned long) const /llvm-project/llvm/include/llvm/ADT/ArrayRef.h:0:7
#13 0x000000000722826e clang::Sema::getPackSubstitutedTemplateArgument(clang::TemplateArgument) const /llvm-project/clang/include/clang/Sema/Sema.h:11767:11
#14 0x0000000007144396 (anonymous namespace)::HashParameterMapping::VisitTemplateTypeParmType(clang::TemplateTypeParmType*) /llvm-project/clang/lib/Sema/SemaConcept.cpp:295:11
#15 0x00000000071441c0 clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::WalkUpFromTemplateTypeParmType(clang::TemplateTypeParmType*) /llvm-project/build-debug-rc1/tools/clang/include/clang/AST/TypeNodes.inc:80:1
#16 0x00000000071417a7 clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::TraverseTemplateTypeParmType(clang::TemplateTypeParmType*, bool) /llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h:1139:1
#17 0x000000000713ddf6 clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::TraverseType(clang::QualType, bool) /llvm-project/build-debug-rc1/tools/clang/include/clang/AST/TypeNodes.inc:80:1
#18 0x000000000713d179 clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::TraverseTemplateArgument(clang::TemplateArgument const&) /llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h:889:5
#19 0x000000000713d0e4 (anonymous namespace)::HashParameterMapping::TraverseTemplateArgument(clang::TemplateArgument const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:378:5
#20 0x000000000713e595 clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::TraverseTemplateArguments(llvm::ArrayRef<clang::TemplateArgument>) /llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h:951:5
#21 0x000000000713d20d clang::RecursiveASTVisitor<(anonymous namespace)::HashParameterMapping>::TraverseTemplateArgument(clang::TemplateArgument const&) /llvm-project/clang/include/clang/AST/RecursiveASTVisitor.h:900:5
#22 0x000000000713d0e4 (anonymous namespace)::HashParameterMapping::TraverseTemplateArgument(clang::TemplateArgument const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:378:5
#23 0x000000000713c903 (anonymous namespace)::HashParameterMapping::VisitConstraint(clang::NormalizedConstraintWithParamMapping const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:422:23
#24 0x000000000713b7a9 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::AtomicConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:749:3
#25 0x000000000713b2b5 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::NormalizedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1095:12
#26 0x000000000713bf94 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::ConceptIdConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1001:18
#27 0x000000000713b2e3 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::NormalizedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1102:12
#28 0x00000000071af8f7 (anonymous namespace)::ConstraintSatisfactionChecker::EvaluateSlow(clang::FoldExpandedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:840:14
#29 0x000000000713bcc5 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::FoldExpandedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:888:18
#30 0x000000000713b2cc (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::NormalizedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1098:12
#31 0x000000000713458d CheckConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, llvm::ArrayRef<clang::AssociatedConstraint>, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&, clang::Expr**, clang::ConceptReference const*) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1169:25
#32 0x0000000007134217 clang::Sema::CheckConstraintSatisfaction(llvm::PointerUnion<clang::NamedDecl const*, clang::concepts::NestedRequirement const*>, llvm::ArrayRef<clang::AssociatedConstraint>, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&, clang::ConceptReference const*, clang::Expr**) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1230:7
#33 0x0000000007136867 CheckFunctionConstraintsWithoutInstantiation(clang::Sema&, clang::SourceLocation, clang::FunctionTemplateDecl*, llvm::ArrayRef<clang::TemplateArgument>, clang::ConstraintSatisfaction&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1678:3
#34 0x00000000071361ee clang::Sema::CheckFunctionTemplateConstraints(clang::SourceLocation, clang::FunctionDecl*, llvm::ArrayRef<clang::TemplateArgument>, clang::ConstraintSatisfaction&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1690:5
#35 0x0000000007b97e0d clang::Sema::FinishTemplateArgumentDeduction(clang::FunctionTemplateDecl*, llvm::SmallVectorImpl<clang::DeducedTemplateArgument>&, unsigned int, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, llvm::SmallVectorImpl<clang::Sema::OriginalCallArg> const*, bool, bool, bool, llvm::function_ref<bool (bool)>) /llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:3981:9
#36 0x0000000007c237da clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, bool, bool, bool, clang::QualType, clang::Expr::Classification, bool, llvm::function_ref<bool (llvm::ArrayRef<clang::QualType>, bool)>)::$_2::operator()() const /llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4719:14
#37 0x0000000007c236c5 void llvm::function_ref<void ()>::callback_fn<clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, bool, bool, bool, clang::QualType, clang::Expr::Classification, bool, llvm::function_ref<bool (llvm::ArrayRef<clang::QualType>, bool)>)::$_2>(long) /llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:5
#38 0x00000000022c8ce9 llvm::function_ref<void ()>::operator()() const /llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:5
#39 0x000000000923ad73 clang::runWithSufficientStackSpace(llvm::function_ref<void ()>, llvm::function_ref<void ()>) /llvm-project/clang/include/clang/Basic/Stack.h:55:3
#40 0x000000000923abe0 clang::StackExhaustionHandler::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) /llvm-project/clang/lib/Basic/StackExhaustionHandler.cpp:21:1
#41 0x0000000006fad508 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) /llvm-project/clang/lib/Sema/Sema.cpp:628:1
#42 0x0000000007b9a5a5 clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, bool, bool, bool, clang::QualType, clang::Expr::Classification, bool, llvm::function_ref<bool (llvm::ArrayRef<clang::QualType>, bool)>) /llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4729:12
#43 0x00000000079a8faf AddMethodTemplateCandidateImmediately(clang::Sema&, clang::OverloadCandidateSet&, clang::FunctionTemplateDecl*, clang::DeclAccessPair, clang::CXXRecordDecl*, clang::TemplateArgumentListInfo*, clang::QualType, clang::Expr::Classification, llvm::ArrayRef<clang::Expr*>, bool, bool, clang::OverloadCandidateParamOrder) /llvm-project/clang/lib/Sema/SemaOverload.cpp:7976:31
#44 0x00000000079b56d4 AddTemplateOverloadCandidate(clang::Sema&, clang::OverloadCandidateSet&, clang::DeferredMethodTemplateOverloadCandidate&) /llvm-project/clang/lib/Sema/SemaOverload.cpp:11322:1
#45 0x00000000079b5489 clang::OverloadCandidateSet::InjectNonDeducedTemplateCandidates(clang::Sema&) /llvm-project/clang/lib/Sema/SemaOverload.cpp:11357:7
#46 0x00000000079a3d3f clang::OverloadCandidateSet::BestViableFunction(clang::Sema&, clang::SourceLocation, clang::OverloadCandidate*&) /llvm-project/clang/lib/Sema/SemaOverload.cpp:11445:3
#47 0x00000000079c999f clang::Sema::BuildCallToObjectOfClassType(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation) /llvm-project/clang/lib/Sema/SemaOverload.cpp:16509:3
#48 0x00000000074324df clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) /llvm-project/clang/lib/Sema/SemaExpr.cpp:6714:14
#49 0x000000000744b48f clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) /llvm-project/clang/lib/Sema/SemaExpr.cpp:6598:7
#50 0x0000000007d58f82 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::RebuildCallExpr(clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) /llvm-project/clang/lib/Sema/TreeTransform.h:2934:22
#51 0x0000000007d44461 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCallExpr(clang::CallExpr*) /llvm-project/clang/lib/Sema/TreeTransform.h:13615:23
#52 0x0000000007cbe92e clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) /llvm-project/build-debug-rc1/tools/clang/include/clang/AST/StmtNodes.inc:614:1
#53 0x0000000007d50862 (anonymous namespace)::TemplateInstantiator::TransformExprRequirement(clang::concepts::ExprRequirement*) /llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:2639:31
#54 0x0000000007d4efa9 (anonymous namespace)::TemplateInstantiator::TransformRequiresExprRequirements(llvm::ArrayRef<clang::concepts::Requirement*>, llvm::SmallVectorImpl<clang::concepts::Requirement*>&) /llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1798:22
#55 0x0000000007d4e91e clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformRequiresExpr(clang::RequiresExpr*) /llvm-project/clang/lib/Sema/TreeTransform.h:15214:7
#56 0x0000000007d3ce34 (anonymous namespace)::TemplateInstantiator::TransformRequiresExpr(clang::RequiresExpr*) /llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1770:40
#57 0x0000000007cbdad3 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) /llvm-project/build-debug-rc1/tools/clang/include/clang/AST/StmtNodes.inc:116:1
#58 0x0000000007cbd80d clang::Sema::SubstExpr(clang::Expr*, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:4358:23
#59 0x0000000007cbf445 clang::Sema::SubstConstraintExpr(clang::Expr*, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:4377:10
#60 0x00000000071af1de (anonymous namespace)::ConstraintSatisfactionChecker::EvaluateAtomicConstraint(clang::Expr const*, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:537:11
#61 0x000000000713caeb (anonymous namespace)::ConstraintSatisfactionChecker::EvaluateSlow(clang::AtomicConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:676:38
#62 0x000000000713b925 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::AtomicConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:762:18
#63 0x000000000713b2b5 (anonymous namespace)::ConstraintSatisfactionChecker::Evaluate(clang::NormalizedConstraint const&, clang::MultiLevelTemplateArgumentList const&) /llvm-project/clang/lib/Sema/SemaConcept.cpp:1095:12
#64 0x000000000713bf94 (anonymous namespace)::ConstraintSatisfactionChecker::Evalua<truncated>Please see the issue for the entire body.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs