[clang] fix frontend crash when evaluating type trait
authorYingChi Long <me@inclyc.cn>
Thu, 11 Aug 2022 18:14:09 +0000 (02:14 +0800)
committerYingChi Long <me@inclyc.cn>
Fri, 12 Aug 2022 16:02:19 +0000 (00:02 +0800)
commite5825190b8ad7ac8fe762fe4101cd4af04f4c057
treea78a0150b5620bb854d706f154d821b1471c04da
parent4b45999bdd7560c699361c995e58aaa081976db2
[clang] fix frontend crash when evaluating type trait

Before this patch type traits are checked in Parser, so use type traits
directly did not cause assertion faults. However if type traits are initialized
from a template, we didn't perform arity checks before evaluating. This
patch moves arity checks from Parser to Sema, and performing arity
checks in Sema actions, so type traits get checked corretly.

Crash input:

```
template<class... Ts> bool b = __is_constructible(Ts...);
bool x = b<>;
```

After this patch:

```
clang/test/SemaCXX/type-trait-eval-crash-issue-57008.cpp:5:32: error: type trait requires 1 or more arguments; have 0 arguments
template<class... Ts> bool b = __is_constructible(Ts...);
                               ^~~~~~~~~~~~~~~~~~
clang/test/SemaCXX/type-trait-eval-crash-issue-57008.cpp:6:10: note: in instantiation of variable template specialization 'b<>' requested here
bool x = b<>;
         ^
1 error generated.
```

See https://godbolt.org/z/q39W78hsK.

Fixes https://github.com/llvm/llvm-project/issues/57008

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D131423
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/TypeTraits.h
clang/include/clang/Sema/Sema.h
clang/lib/Basic/TypeTraits.cpp
clang/lib/Parse/ParseExprCXX.cpp
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/type-trait-eval-crash-issue-57008.cpp [new file with mode: 0644]