llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
26.68k stars 10.93k forks source link

[clang][C++] Bad error recovery with lambdas returning unexpanded packs #91696

Open mizvekov opened 1 month ago

mizvekov commented 1 month ago
template <class> requires ([]<class... Ts> -> Ts {}()) void f();
template void f<void>();

Crashes with:

test.cc:1:28: error: declaration type contains unexpanded parameter pack 'Ts'
    1 | template <class> requires ([]<class... Ts> -> Ts {}()) void f();
      |                            ^                  ~~
Assertion failed: (!isValueDependent() && "Expression evaluator can't be called on a dependent expression."), function EvaluateAsConstantExpr, file ExprConstant.cpp, line 15953.
llvmbot commented 1 month ago

@llvm/issue-subscribers-c-1

Author: Matheus Izvekov (mizvekov)

```C++ template <class> requires ([]<class... Ts> -> Ts {}()) void f(); template void f<void>(); ``` Crashes with: ``` test.cc:1:28: error: declaration type contains unexpanded parameter pack 'Ts' 1 | template <class> requires ([]<class... Ts> -> Ts {}()) void f(); | ^ ~~ Assertion failed: (!isValueDependent() && "Expression evaluator can't be called on a dependent expression."), function EvaluateAsConstantExpr, file ExprConstant.cpp, line 15953. ```
llvmbot commented 1 month ago

@llvm/issue-subscribers-clang-frontend

Author: Matheus Izvekov (mizvekov)

```C++ template <class> requires ([]<class... Ts> -> Ts {}()) void f(); template void f<void>(); ``` Crashes with: ``` test.cc:1:28: error: declaration type contains unexpanded parameter pack 'Ts' 1 | template <class> requires ([]<class... Ts> -> Ts {}()) void f(); | ^ ~~ Assertion failed: (!isValueDependent() && "Expression evaluator can't be called on a dependent expression."), function EvaluateAsConstantExpr, file ExprConstant.cpp, line 15953. ```
llvmbot commented 1 month ago

@llvm/issue-subscribers-c-20

Author: Matheus Izvekov (mizvekov)

```C++ template <class> requires ([]<class... Ts> -> Ts {}()) void f(); template void f<void>(); ``` Crashes with: ``` test.cc:1:28: error: declaration type contains unexpanded parameter pack 'Ts' 1 | template <class> requires ([]<class... Ts> -> Ts {}()) void f(); | ^ ~~ Assertion failed: (!isValueDependent() && "Expression evaluator can't be called on a dependent expression."), function EvaluateAsConstantExpr, file ExprConstant.cpp, line 15953. ```
mizvekov commented 1 month ago

FYI the 'concepts' / requires are unrelated, this is just a nice way to test an expression is value dependent when it shouldn't.