mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[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:
@@ -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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user