[clang] [clang-tools-extra] [Clang] Implement CWG2813: Class member access with prvalues (PR #95112)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 17 12:46:12 PDT 2024
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff c22d3917b93a6d54613d2e5b2ea4c97546144c46 37f24484fcb0a71cef93928ab2f8e6c689c34868 -- clang-tools-extra/clangd/unittests/DumpASTTests.cpp clang/include/clang/Sema/Sema.h clang/lib/AST/Expr.cpp clang/lib/AST/ExprConstant.cpp clang/lib/CodeGen/CGExprAgg.cpp clang/lib/Sema/SemaExprMember.cpp clang/lib/Sema/SemaInit.cpp clang/lib/Sema/SemaOverload.cpp clang/lib/Sema/SemaStmt.cpp clang/test/AST/ast-dump-for-range-lifetime.cpp clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.nodiscard/p2.cpp clang/test/CXX/drs/cwg28xx.cpp clang/test/CodeGenCXX/cxx2b-deducing-this.cpp clang/test/SemaCXX/ms-property.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 4dfac76834..6c64384718 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -10541,22 +10541,29 @@ bool RecordExprEvaluator::VisitCXXStdInitializerListExpr(
return false;
};
- // FIXME: Call default constructor? Default constructors of base classes if any?
+ // FIXME: Call default constructor? Default constructors of base classes if
+ // any?
Result = APValue(APValue::UninitStruct(), 0, 2);
Array.moveInto(Result.getStructField(0));
RecordDecl *Record = E->getType()->castAs<RecordType>()->getDecl();
RecordDecl::field_iterator Field = Record->field_begin();
- assert(Field != Record->field_end() && Info.Ctx.hasSameType(Field->getType()->getPointeeType(), ArrayType->getElementType()) && "Expected std::initializer_list first field to be const E *");
+ assert(Field != Record->field_end() &&
+ Info.Ctx.hasSameType(Field->getType()->getPointeeType(),
+ ArrayType->getElementType()) &&
+ "Expected std::initializer_list first field to be const E *");
++Field;
- assert(Field != Record->field_end() && "Expected std::initializer_list to have two fields");
+ assert(Field != Record->field_end() &&
+ "Expected std::initializer_list to have two fields");
if (Info.Ctx.hasSameType(Field->getType(), Info.Ctx.getSizeType())) {
// Length.
Result.getStructField(1) = APValue(APSInt(ArrayType->getSize()));
} else {
// End pointer.
- assert(Info.Ctx.hasSameType(Field->getType()->getPointeeType(), ArrayType->getElementType()) && "Expected std::initializer_list second field to be const E *");
+ assert(Info.Ctx.hasSameType(Field->getType()->getPointeeType(),
+ ArrayType->getElementType()) &&
+ "Expected std::initializer_list second field to be const E *");
if (!HandleLValueArrayAdjustment(Info, E, Array,
ArrayType->getElementType(),
ArrayType->getZExtSize()))
@@ -10564,7 +10571,8 @@ bool RecordExprEvaluator::VisitCXXStdInitializerListExpr(
Array.moveInto(Result.getStructField(1));
}
- assert(++Field == Record->field_end() && "Expected std::initializer_list to only have two fields");
+ assert(++Field == Record->field_end() &&
+ "Expected std::initializer_list to only have two fields");
return true;
}
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp
index bd4eae9df5..84524b6bf8 100644
--- a/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/clang/lib/CodeGen/CGExprAgg.cpp
@@ -428,7 +428,10 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
RecordDecl *Record = E->getType()->castAs<RecordType>()->getDecl();
RecordDecl::field_iterator Field = Record->field_begin();
- assert(Field != Record->field_end() && Ctx.hasSameType(Field->getType()->getPointeeType(), ArrayType->getElementType()) && "Expected std::initializer_list first field to be const E *");
+ assert(Field != Record->field_end() &&
+ Ctx.hasSameType(Field->getType()->getPointeeType(),
+ ArrayType->getElementType()) &&
+ "Expected std::initializer_list first field to be const E *");
// Start pointer.
AggValueSlot Dest = EnsureSlot(E->getType());
@@ -437,7 +440,8 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
llvm::Value *ArrayStart = ArrayPtr.emitRawPointer(CGF);
CGF.EmitStoreThroughLValue(RValue::get(ArrayStart), Start);
++Field;
- assert(Field != Record->field_end() && "Expected std::initializer_list to have two fields");
+ assert(Field != Record->field_end() &&
+ "Expected std::initializer_list to have two fields");
llvm::Value *Size = Builder.getInt(ArrayType->getSize());
LValue EndOrLength = CGF.EmitLValueForFieldInitialization(DestLV, *Field);
@@ -447,7 +451,10 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
} else {
// End pointer.
- assert(Field->getType()->isPointerType() && Ctx.hasSameType(Field->getType()->getPointeeType(), ArrayType->getElementType()) && "Expected std::initializer_list second field to be const E *");
+ assert(Field->getType()->isPointerType() &&
+ Ctx.hasSameType(Field->getType()->getPointeeType(),
+ ArrayType->getElementType()) &&
+ "Expected std::initializer_list second field to be const E *");
llvm::Value *Zero = llvm::ConstantInt::get(CGF.PtrDiffTy, 0);
llvm::Value *IdxEnd[] = { Zero, Size };
llvm::Value *ArrayEnd = Builder.CreateInBoundsGEP(
@@ -456,7 +463,8 @@ AggExprEmitter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
CGF.EmitStoreThroughLValue(RValue::get(ArrayEnd), EndOrLength);
}
- assert(++Field == Record->field_end() && "Expected std::initializer_list to only have two fields");
+ assert(++Field == Record->field_end() &&
+ "Expected std::initializer_list to only have two fields");
}
/// Determine if E is a trivial array filler, that is, one that is
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 5ac51ffb6c..527b18a98d 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -9393,10 +9393,15 @@ ExprResult InitializationSequence::Perform(Sema &S,
CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
if (!Step->Type->isDependentType()) {
- assert(S.isCompleteType(CurInit.get()->getExprLoc(), Step->Type, Sema::CompleteTypeKind::Normal) && "std::initializer_list<E> incomplete when used during initialization");
+ assert(S.isCompleteType(CurInit.get()->getExprLoc(), Step->Type,
+ Sema::CompleteTypeKind::Normal) &&
+ "std::initializer_list<E> incomplete when used during "
+ "initialization");
QualType ElementType;
- [[maybe_unused]] bool IsStdInitializerList = S.isStdInitializerList(Step->Type, &ElementType);
- assert(IsStdInitializerList && "StdInitializerList step to non-std::initializer_list");
+ [[maybe_unused]] bool IsStdInitializerList =
+ S.isStdInitializerList(Step->Type, &ElementType);
+ assert(IsStdInitializerList &&
+ "StdInitializerList step to non-std::initializer_list");
auto InvalidType = [&] {
S.Diag(CurInit, diag::err_std_initializer_list_malformed)
@@ -9411,17 +9416,21 @@ ExprResult InitializationSequence::Perform(Sema &S,
// FIXME: What if the initializer_list type has base classes, etc?
// Start pointer.
- if (!Field->getType()->isPointerType() || !S.Context.hasSameType(Field->getType()->getPointeeType(), ElementType.withConst()))
+ if (!Field->getType()->isPointerType() ||
+ !S.Context.hasSameType(Field->getType()->getPointeeType(),
+ ElementType.withConst()))
return InvalidType();
if (++Field == Record->field_end())
return InvalidType();
if (Field->getType()->isPointerType()) {
- if (!S.Context.hasSameType(Field->getType()->getPointeeType(), ElementType.withConst()))
+ if (!S.Context.hasSameType(Field->getType()->getPointeeType(),
+ ElementType.withConst()))
return InvalidType();
} else {
- if (Field->isUnnamedBitField() || !S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
+ if (Field->isUnnamedBitField() ||
+ !S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
return InvalidType();
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/95112
More information about the cfe-commits
mailing list