[Clang] Adjust assert from Sema::BuildCXXTypeConstructExpr

Currently Sema::BuildCXXTypeConstructExpr asserts that list initialization must
mean we have an InitListExpr as well. We have several cases of valid code the
result in CXXTemporaryObjectExpr in the AST instead for list initialization.
Commit 1ae689c seems to indicate that this is not unexpected, although may be a
design issue

This fixes:

  https://github.com/llvm/llvm-project/issues/58302
  https://github.com/llvm/llvm-project/issues/58753
  https://github.com/llvm/llvm-project/issues/59100

Differential Revision: https://reviews.llvm.org/D138947
This commit is contained in:
Shafik Yaghmour
2022-12-01 09:38:13 -08:00
parent f4eb87f403
commit ef10f81985
4 changed files with 36 additions and 3 deletions

View File

@@ -311,6 +311,11 @@ Bug Fixes
`Issue 58067 <https://github.com/llvm/llvm-project/issues/58057>`_
`Issue 59014 <https://github.com/llvm/llvm-project/issues/59014>`_
`Issue 54746 <https://github.com/llvm/llvm-project/issues/54746>`_
- Fix assert that triggers a crash during some types of list initialization that
generate a CXXTemporaryObjectExpr instead of a InitListExpr. This fixes
`Issue 58302 <https://github.com/llvm/llvm-project/issues/58302>`_
`Issue 58753 <https://github.com/llvm/llvm-project/issues/58753>`_
`Issue 59100 <https://github.com/llvm/llvm-project/issues/59100>`_
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -1459,9 +1459,8 @@ Sema::BuildCXXTypeConstructExpr(TypeSourceInfo *TInfo,
QualType Ty = TInfo->getType();
SourceLocation TyBeginLoc = TInfo->getTypeLoc().getBeginLoc();
assert((!ListInitialization ||
(Exprs.size() == 1 && isa<InitListExpr>(Exprs[0]))) &&
"List initialization must have initializer list as expression.");
assert((!ListInitialization || Exprs.size() == 1) &&
"List initialization must have exactly one expression.");
SourceRange FullRange = SourceRange(TyBeginLoc, RParenOrBraceLoc);
InitializedEntity Entity =

View File

@@ -140,3 +140,21 @@ namespace PR20844 {
namespace PR21834 {
const int &a = (const int &){0}; // expected-error {{cannot bind to an initializer list}}
}
namespace GH59100 {
class v {};
template <typename T>
class V : public v {};
using T = const V<int> &;
template <class D>
void f() {
auto t = T{};
}
void z() {
f<int>();
}
}

View File

@@ -1018,3 +1018,14 @@ void g() {
(void)[](int i) consteval { return i; }(0);
}
} // namespace GH50455
namespace GH58302 {
struct A {
consteval A(){}
consteval operator int() { return 1;}
};
int f() {
int x = A{};
}
}