diff options
author | Alan Zhao <ayzhao@google.com> | 2023-04-27 15:31:51 -0700 |
---|---|---|
committer | Alan Zhao <ayzhao@google.com> | 2023-05-01 09:27:52 -0700 |
commit | da0089c99ba1507b876cf3d2a205ba108aad65ff (patch) | |
tree | dd1c415ed42459651d05e81f92135c3e063e06b2 /llvm/lib/ProfileData/SampleProfReader.cpp | |
parent | ce357fd4ee7f1f0b054d01166329b5b3d0d91441 (diff) | |
download | llvm-da0089c99ba1507b876cf3d2a205ba108aad65ff.zip llvm-da0089c99ba1507b876cf3d2a205ba108aad65ff.tar.gz llvm-da0089c99ba1507b876cf3d2a205ba108aad65ff.tar.bz2 |
[clang] Fix default initializers being ignored when initializing templated aggregate types
Previously, when checking whether an in-class initializer exists when
performing parenthesized aggregate initialization, Clang checks that the
output of FieldDecl::getInClassInitializer() is non-null. This is
incorrect; if the field is part of a templated type, then
getInClassInitializer() will return nullptr if we haven't called
Sem::BuildCXXDefaultInitExpr(...) before, even if
FieldDecl::hasInClassInitializer() returns true. The end result is that
Clang incorrectly ignores the in class initializer and
value-initializes the field. The fix therefore is to instead call
FieldDecl::hasInClassInitializer(), which is what we do for braced init
lists [0].
Before this patch, Clang does correctly recognize the in-class field
initializer in certain cases. This is Sema::BuildCXXDefaultInitExpr(...)
populates the in class initializer of the corresponding FieldDecl
object. Therefore, if that method was previously called with the same
FieldDecl object, as can happen with a decltype(...) or a braced list
initialization, FieldDecl::getInClassInitializer() will return a
non-null expression, and the field becomes properly initialized.
Fixes 62266
[0]: https://github.com/llvm/llvm-project/blob/be5f35e24f4c15caf3c4aeccddc54c52560c28a0/clang/lib/Sema/SemaInit.cpp#L685
Reviewed By: shafik
Differential Revision: https://reviews.llvm.org/D149389
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfReader.cpp')
0 files changed, 0 insertions, 0 deletions