[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