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 HEAD~1 HEAD --extensions cpp -- 
clang/lib/Sema/SemaTypeTraits.cpp clang/lib/Sema/SemaDeclCXX.cpp 
clang/lib/Sema/SemaExprCXX.cpp
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 63cf324dd..d8338e08d 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5292,7 +5292,6 @@ Sema::PerformImplicitConversion(Expr *From, QualType 
ToType,
   return From;
 }
 
-
 QualType Sema::CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS,
                                             ExprValueKind &VK,
                                             SourceLocation Loc,
diff --git a/clang/lib/Sema/SemaTypeTraits.cpp 
b/clang/lib/Sema/SemaTypeTraits.cpp
index 763d37071..bac71c07d 100644
--- a/clang/lib/Sema/SemaTypeTraits.cpp
+++ b/clang/lib/Sema/SemaTypeTraits.cpp
@@ -358,7 +358,6 @@ bool Sema::IsCXXReplaceableType(QualType Type) {
   return false;
 }
 
-
 /// Checks that type T is not a VLA.
 ///
 /// @returns @c true if @p T is VLA and a diagnostic was emitted,
@@ -406,15 +405,16 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
   // these class templates. We also try to follow any GCC documented behavior
   // in these expressions to ensure portability of standard libraries.
   switch (UTT) {
-  default: llvm_unreachable("not a UTT");
+  default:
+    llvm_unreachable("not a UTT");
     // is_complete_type somewhat obviously cannot require a complete type.
   case UTT_IsCompleteType:
-                           // Fall-through
+    // Fall-through
 
-           // These traits are modeled on the type predicates in C++0x
-           // [meta.unary.cat] and [meta.unary.comp]. They are not specified as
-           // requiring a complete type, as whether or not they return true 
cannot be
-           // impacted by the completeness of the type.
+    // These traits are modeled on the type predicates in C++0x
+    // [meta.unary.cat] and [meta.unary.comp]. They are not specified as
+    // requiring a complete type, as whether or not they return true cannot be
+    // impacted by the completeness of the type.
   case UTT_IsVoid:
   case UTT_IsIntegral:
   case UTT_IsFloatingPoint:
@@ -438,29 +438,29 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
   case UTT_IsCompound:
   case UTT_IsMemberPointer:
   case UTT_IsTypedResourceElementCompatible:
-                                             // Fall-through
+    // Fall-through
 
-           // These traits are modeled on type predicates in C++0x 
[meta.unary.prop]
-           // which requires some of its traits to have the complete type. 
However,
-           // the completeness of the type cannot impact these traits' 
semantics, and
-           // so they don't require it. This matches the comments on these 
traits in
-           // Table 49.
+    // These traits are modeled on type predicates in C++0x [meta.unary.prop]
+    // which requires some of its traits to have the complete type. However,
+    // the completeness of the type cannot impact these traits' semantics, and
+    // so they don't require it. This matches the comments on these traits in
+    // Table 49.
   case UTT_IsConst:
   case UTT_IsVolatile:
   case UTT_IsSigned:
   case UTT_IsUnboundedArray:
   case UTT_IsUnsigned:
 
-           // This type trait always returns false, checking the type is moot.
+    // This type trait always returns false, checking the type is moot.
   case UTT_IsInterfaceClass:
     return true;
 
-           // We diagnose incomplete class types later.
+    // We diagnose incomplete class types later.
   case UTT_StructuredBindingSize:
     return true;
 
-           // C++14 [meta.unary.prop]:
-           //   If T is a non-union class type, T shall be a complete type.
+    // C++14 [meta.unary.prop]:
+    //   If T is a non-union class type, T shall be a complete type.
   case UTT_IsEmpty:
   case UTT_IsPolymorphic:
   case UTT_IsAbstract:
@@ -470,8 +470,8 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
             Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
     return true;
 
-           // C++14 [meta.unary.prop]:
-           //   If T is a class type, T shall be a complete type.
+    // C++14 [meta.unary.prop]:
+    //   If T is a class type, T shall be a complete type.
   case UTT_IsFinal:
   case UTT_IsSealed:
     if (ArgTy->getAsCXXRecordDecl())
@@ -479,7 +479,7 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
           Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
     return true;
 
-           // LWG3823: T shall be an array type, a complete type, or cv void.
+    // LWG3823: T shall be an array type, a complete type, or cv void.
   case UTT_IsAggregate:
   case UTT_IsImplicitLifetime:
     if (ArgTy->isArrayType() || ArgTy->isVoidType())
@@ -488,8 +488,8 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
     return !S.RequireCompleteType(
         Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
 
-           // has_unique_object_representations<T>
-           // remove_all_extents_t<T> shall be a complete type or cv void 
(LWG4113).
+    // has_unique_object_representations<T>
+    // remove_all_extents_t<T> shall be a complete type or cv void (LWG4113).
   case UTT_HasUniqueObjectRepresentations:
     ArgTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0);
     if (ArgTy->isVoidType())
@@ -497,8 +497,8 @@ static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 
TypeTrait UTT,
     return !S.RequireCompleteType(
         Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
 
-           // C++1z [meta.unary.prop]:
-           //   remove_all_extents_t<T> shall be a complete type or cv void.
+    // C++1z [meta.unary.prop]:
+    //   remove_all_extents_t<T> shall be a complete type or cv void.
   case UTT_IsTrivial:
   case UTT_IsTriviallyCopyable:
   case UTT_IsStandardLayout:
@@ -546,8 +546,7 @@ static bool HasNoThrowOperator(const RecordType *RT, 
OverloadedOperatorKind Op,
                                Sema &Self, SourceLocation KeyLoc, ASTContext 
&C,
                                bool (CXXRecordDecl::*HasTrivial)() const,
                                bool (CXXRecordDecl::*HasNonTrivial)() const,
-                               bool (CXXMethodDecl::*IsDesiredOp)() const)
-{
+                               bool (CXXMethodDecl::*IsDesiredOp)() const) {
   CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
   if ((RD->*HasTrivial)() && !(RD->*HasNonTrivial)())
     return true;
@@ -564,7 +563,7 @@ static bool HasNoThrowOperator(const RecordType *RT, 
OverloadedOperatorKind Op,
         continue;
 
       CXXMethodDecl *Operator = cast<CXXMethodDecl>(*Op);
-      if((Operator->*IsDesiredOp)()) {
+      if ((Operator->*IsDesiredOp)()) {
         FoundOperator = true;
         auto *CPT = Operator->getType()->castAs<FunctionProtoType>();
         CPT = Self.ResolveExceptionSpec(KeyLoc, CPT);
@@ -591,7 +590,7 @@ static bool HasNonDeletedDefaultedEqualityComparison(Sema 
&S,
     Sema::SFINAETrap SFINAE(S, /*ForValidityCheck=*/true);
     Sema::ContextRAII TUContext(S, S.Context.getTranslationUnitDecl());
 
-           // const ClassT& obj;
+    // const ClassT& obj;
     OpaqueValueExpr Operand(
         KeyLoc,
         Decl->getTypeForDecl()->getCanonicalTypeUnqualified().withConst(),
@@ -640,7 +639,8 @@ static bool HasNonDeletedDefaultedEqualityComparison(Sema 
&S,
          });
 }
 
-static bool isTriviallyEqualityComparableType(Sema &S, QualType Type, 
SourceLocation KeyLoc) {
+static bool isTriviallyEqualityComparableType(Sema &S, QualType Type,
+                                              SourceLocation KeyLoc) {
   QualType CanonicalType = Type.getCanonicalType();
   if (CanonicalType->isIncompleteType() || CanonicalType->isDependentType() ||
       CanonicalType->isEnumeralType() || CanonicalType->isArrayType())
@@ -693,8 +693,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
   assert(!T->isDependentType() && "Cannot evaluate traits of dependent type");
 
   ASTContext &C = Self.Context;
-  switch(UTT) {
-  default: llvm_unreachable("not a UTT");
+  switch (UTT) {
+  default:
+    llvm_unreachable("not a UTT");
     // Type trait expressions corresponding to the primary type category
     // predicates in C++0x [meta.unary.cat].
   case UTT_IsVoid:
@@ -742,8 +743,8 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
   case UTT_IsFunction:
     return T->isFunctionType();
 
-           // Type trait expressions which correspond to the convenient 
composition
-           // predicates in C++0x [meta.unary.comp].
+    // Type trait expressions which correspond to the convenient composition
+    // predicates in C++0x [meta.unary.comp].
   case UTT_IsReference:
     return T->isReferenceType();
   case UTT_IsArithmetic:
@@ -776,8 +777,8 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
   case UTT_IsMemberPointer:
     return T->isMemberPointerType();
 
-           // Type trait expressions which correspond to the type property 
predicates
-           // in C++0x [meta.unary.prop].
+    // Type trait expressions which correspond to the type property predicates
+    // in C++0x [meta.unary.prop].
   case UTT_IsConst:
     return T.isConstQualified();
   case UTT_IsVolatile:
@@ -829,21 +830,22 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
     // Enum types should always return false.
     return T->isUnsignedIntegerType() && !T->isEnumeralType();
 
-           // Type trait expressions which query classes regarding their 
construction,
-           // destruction, and copying. Rather than being based directly on the
-           // related type predicates in the standard, they are specified by 
both
-           // GCC[1] and the Embarcadero C++ compiler[2], and Clang implements 
those
-           // specifications.
-           //
-           //   1: http://gcc.gnu/.org/onlinedocs/gcc/Type-Traits.html
-           //   2: 
http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index
-           //
-           // Note that these builtins do not behave as documented in g++: if 
a class
-           // has both a trivial and a non-trivial special member of a 
particular kind,
-           // they return false! For now, we emulate this behavior.
-           // FIXME: This appears to be a g++ bug: more complex cases reveal 
that it
-           // does not correctly compute triviality in the presence of 
multiple special
-           // members of the same kind. Revisit this once the g++ bug is fixed.
+    // Type trait expressions which query classes regarding their construction,
+    // destruction, and copying. Rather than being based directly on the
+    // related type predicates in the standard, they are specified by both
+    // GCC[1] and the Embarcadero C++ compiler[2], and Clang implements those
+    // specifications.
+    //
+    //   1: http://gcc.gnu/.org/onlinedocs/gcc/Type-Traits.html
+    //   2:
+    //   
http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index
+    //
+    // Note that these builtins do not behave as documented in g++: if a class
+    // has both a trivial and a non-trivial special member of a particular 
kind,
+    // they return false! For now, we emulate this behavior.
+    // FIXME: This appears to be a g++ bug: more complex cases reveal that it
+    // does not correctly compute triviality in the presence of multiple 
special
+    // members of the same kind. Revisit this once the g++ bug is fixed.
   case UTT_HasTrivialDefaultConstructor:
     // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
     //   If __is_pod (type) is true then the trait is true, else if type is
@@ -862,7 +864,8 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
     if (T.isPODType(C))
       return true;
     if (CXXRecordDecl *RD = C.getBaseElementType(T)->getAsCXXRecordDecl())
-      return RD->hasTrivialMoveConstructor() && 
!RD->hasNonTrivialMoveConstructor();
+      return RD->hasTrivialMoveConstructor() &&
+             !RD->hasNonTrivialMoveConstructor();
     return false;
   case UTT_HasTrivialCopy:
     // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
@@ -883,7 +886,8 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
     if (T.isPODType(C))
       return true;
     if (CXXRecordDecl *RD = C.getBaseElementType(T)->getAsCXXRecordDecl())
-      return RD->hasTrivialMoveAssignment() && 
!RD->hasNonTrivialMoveAssignment();
+      return RD->hasTrivialMoveAssignment() &&
+             !RD->hasNonTrivialMoveAssignment();
     return false;
   case UTT_HasTrivialAssign:
     // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
@@ -914,26 +918,26 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
     if (T->isReferenceType())
       return true;
 
-           // Objective-C++ ARC: autorelease types don't require destruction.
+    // Objective-C++ ARC: autorelease types don't require destruction.
     if (T->isObjCLifetimeType() &&
         T.getObjCLifetime() == Qualifiers::OCL_Autoreleasing)
       return true;
 
-           // C++14 [meta.unary.prop]:
-           //   For incomplete types and function types, 
is_destructible<T>::value is
-           //   false.
+    // C++14 [meta.unary.prop]:
+    //   For incomplete types and function types, is_destructible<T>::value is
+    //   false.
     if (T->isIncompleteType() || T->isFunctionType())
       return false;
 
-           // A type that requires destruction (via a non-trivial destructor 
or ARC
-           // lifetime semantics) is not trivially-destructible.
+    // A type that requires destruction (via a non-trivial destructor or ARC
+    // lifetime semantics) is not trivially-destructible.
     if (UTT == UTT_IsTriviallyDestructible && T.isDestructedType())
       return false;
 
-           // C++14 [meta.unary.prop]:
-           //   For object types and given U equal to remove_all_extents_t<T>, 
if the
-           //   expression std::declval<U&>().~U() is well-formed when treated 
as an
-           //   unevaluated operand (Clause 5), then is_destructible<T>::value 
is true
+    // C++14 [meta.unary.prop]:
+    //   For object types and given U equal to remove_all_extents_t<T>, if the
+    //   expression std::declval<U&>().~U() is well-formed when treated as an
+    //   unevaluated operand (Clause 5), then is_destructible<T>::value is true
     if (auto *RD = C.getBaseElementType(T)->getAsCXXRecordDecl()) {
       CXXDestructorDecl *Destructor = Self.LookupDestructor(RD);
       if (!Destructor)
@@ -964,7 +968,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
     if (T.isPODType(C) || T->isReferenceType())
       return true;
 
-           // Objective-C++ ARC: autorelease types don't require destruction.
+    // Objective-C++ ARC: autorelease types don't require destruction.
     if (T->isObjCLifetimeType() &&
         T.getObjCLifetime() == Qualifiers::OCL_Autoreleasing)
       return true;
@@ -1094,9 +1098,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait 
UTT,
         return Destructor->isVirtual();
     return false;
 
-           // These type trait expressions are modeled on the specifications 
for the
-           // Embarcadero C++0x type trait functions:
-           //   
http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index
+    // These type trait expressions are modeled on the specifications for the
+    // Embarcadero C++0x type trait functions:
+    //   
http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index
   case UTT_IsCompleteType:
     // 
http://docwiki.embarcadero.com/RADStudio/XE/en/Is_complete_type_(typename_T_):
     //   Returns True if and only if T is a complete type at the point of the
@@ -1125,10 +1129,10 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, 
TypeTrait UTT,
     DiagnoseAtomicInCXXTypeTrait(Self, TInfo,
                                  tok::kw___builtin_is_implicit_lifetime);
 
-           // [basic.types.general] p9
-           // Scalar types, implicit-lifetime class types ([class.prop]),
-           // array types, and cv-qualified versions of these types
-           // are collectively called implicit-lifetime types.
+    // [basic.types.general] p9
+    // Scalar types, implicit-lifetime class types ([class.prop]),
+    // array types, and cv-qualified versions of these types
+    // are collectively called implicit-lifetime types.
     QualType UnqualT = T->getCanonicalTypeUnqualified();
     if (UnqualT->isScalarType())
       return true;
@@ -1138,11 +1142,11 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, 
TypeTrait UTT,
     if (!RD)
       return false;
 
-           // [class.prop] p9
-           // A class S is an implicit-lifetime class if
-           //   - it is an aggregate whose destructor is not user-provided or
-           //   - it has at least one trivial eligible constructor and a 
trivial,
-           //     non-deleted destructor.
+    // [class.prop] p9
+    // A class S is an implicit-lifetime class if
+    //   - it is an aggregate whose destructor is not user-provided or
+    //   - it has at least one trivial eligible constructor and a trivial,
+    //     non-deleted destructor.
     const CXXDestructorDecl *Dtor = RD->getDestructor();
     if (UnqualT->isAggregateType())
       if (Dtor && !Dtor->isUserProvided())
@@ -1174,10 +1178,10 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, 
TypeTrait UTT,
   }
 }
 
-
-
-static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const 
TypeSourceInfo *Lhs,
-                                    const TypeSourceInfo *Rhs, SourceLocation 
KeyLoc);
+static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT,
+                                    const TypeSourceInfo *Lhs,
+                                    const TypeSourceInfo *Rhs,
+                                    SourceLocation KeyLoc);
 
 static ExprResult CheckConvertibilityForTypeTraits(
     Sema &Self, const TypeSourceInfo *Lhs, const TypeSourceInfo *Rhs,
@@ -1186,45 +1190,45 @@ static ExprResult CheckConvertibilityForTypeTraits(
   QualType LhsT = Lhs->getType();
   QualType RhsT = Rhs->getType();
 
-         // C++0x [meta.rel]p4:
-         //   Given the following function prototype:
-         //
-         //     template <class T>
-         //       typename add_rvalue_reference<T>::type create();
-         //
-         //   the predicate condition for a template specialization
-         //   is_convertible<From, To> shall be satisfied if and only if
-         //   the return expression in the following code would be
-         //   well-formed, including any implicit conversions to the return
-         //   type of the function:
-         //
-         //     To test() {
-         //       return create<From>();
-         //     }
-         //
-         //   Access checking is performed as if in a context unrelated to To 
and
-         //   From. Only the validity of the immediate context of the 
expression
-         //   of the return-statement (including conversions to the return 
type)
-         //   is considered.
-         //
-         // We model the initialization as a copy-initialization of a temporary
-         // of the appropriate type, which for this expression is identical to 
the
-         // return statement (since NRVO doesn't apply).
-
-         // Functions aren't allowed to return function or array types.
+  // C++0x [meta.rel]p4:
+  //   Given the following function prototype:
+  //
+  //     template <class T>
+  //       typename add_rvalue_reference<T>::type create();
+  //
+  //   the predicate condition for a template specialization
+  //   is_convertible<From, To> shall be satisfied if and only if
+  //   the return expression in the following code would be
+  //   well-formed, including any implicit conversions to the return
+  //   type of the function:
+  //
+  //     To test() {
+  //       return create<From>();
+  //     }
+  //
+  //   Access checking is performed as if in a context unrelated to To and
+  //   From. Only the validity of the immediate context of the expression
+  //   of the return-statement (including conversions to the return type)
+  //   is considered.
+  //
+  // We model the initialization as a copy-initialization of a temporary
+  // of the appropriate type, which for this expression is identical to the
+  // return statement (since NRVO doesn't apply).
+
+  // Functions aren't allowed to return function or array types.
   if (RhsT->isFunctionType() || RhsT->isArrayType())
     return ExprError();
 
-         // A function definition requires a complete, non-abstract return 
type.
+  // A function definition requires a complete, non-abstract return type.
   if (!Self.isCompleteType(Rhs->getTypeLoc().getBeginLoc(), RhsT) ||
       Self.isAbstractType(Rhs->getTypeLoc().getBeginLoc(), RhsT))
     return ExprError();
 
-         // Compute the result of add_rvalue_reference.
+  // Compute the result of add_rvalue_reference.
   if (LhsT->isObjectType() || LhsT->isFunctionType())
     LhsT = Self.Context.getRValueReferenceType(LhsT);
 
-         // Build a fake source and destination for initialization.
+  // Build a fake source and destination for initialization.
   InitializedEntity To(InitializedEntity::InitializeTemporary(RhsT));
   Expr *From = new (OpaqueExprAllocator.Allocate<OpaqueValueExpr>())
       OpaqueValueExpr(KeyLoc, LhsT.getNonLValueExprType(Self.Context),
@@ -1232,8 +1236,8 @@ static ExprResult CheckConvertibilityForTypeTraits(
   InitializationKind Kind =
       InitializationKind::CreateCopy(KeyLoc, SourceLocation());
 
-         // Perform the initialization in an unevaluated context within a 
SFINAE
-         // trap at translation unit scope.
+  // Perform the initialization in an unevaluated context within a SFINAE
+  // trap at translation unit scope.
   EnterExpressionEvaluationContext Unevaluated(
       Self, Sema::ExpressionEvaluationContext::Unevaluated);
   Sema::SFINAETrap SFINAE(Self, /*ForValidityCheck=*/true);
@@ -1287,13 +1291,12 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait 
Kind,
   if (Kind <= UTT_Last)
     return EvaluateUnaryTypeTrait(S, Kind, KWLoc, Args[0]);
 
-         // Evaluate ReferenceBindsToTemporary and 
ReferenceConstructsFromTemporary
-         // alongside the IsConstructible traits to avoid duplication.
+  // Evaluate ReferenceBindsToTemporary and ReferenceConstructsFromTemporary
+  // alongside the IsConstructible traits to avoid duplication.
   if (Kind <= BTT_Last && Kind != BTT_ReferenceBindsToTemporary &&
       Kind != BTT_ReferenceConstructsFromTemporary &&
       Kind != BTT_ReferenceConvertsFromTemporary)
-    return EvaluateBinaryTypeTrait(S, Kind, Args[0],
-                                   Args[1], RParenLoc);
+    return EvaluateBinaryTypeTrait(S, Kind, Args[0], Args[1], RParenLoc);
 
   switch (Kind) {
   case clang::BTT_ReferenceBindsToTemporary:
@@ -1317,25 +1320,25 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait 
Kind,
     //     T t(create<Args>()...);
     assert(!Args.empty());
 
-           // Precondition: T and all types in the parameter pack Args shall be
-           // complete types, (possibly cv-qualified) void, or arrays of
-           // unknown bound.
+    // Precondition: T and all types in the parameter pack Args shall be
+    // complete types, (possibly cv-qualified) void, or arrays of
+    // unknown bound.
     for (const auto *TSI : Args) {
       QualType ArgTy = TSI->getType();
       if (ArgTy->isVoidType() || ArgTy->isIncompleteArrayType())
         continue;
 
-      if (S.RequireCompleteType(KWLoc, ArgTy,
-                                
diag::err_incomplete_type_used_in_type_trait_expr))
+      if (S.RequireCompleteType(
+              KWLoc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr))
         return false;
     }
 
-           // Make sure the first argument is not incomplete nor a function 
type.
+    // Make sure the first argument is not incomplete nor a function type.
     QualType T = Args[0]->getType();
     if (T->isIncompleteType() || T->isFunctionType())
       return false;
 
-           // Make sure the first argument is not an abstract type.
+    // Make sure the first argument is not an abstract type.
     CXXRecordDecl *RD = T->getAsCXXRecordDecl();
     if (RD && RD->isAbstract())
       return false;
@@ -1349,13 +1352,13 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait 
Kind,
         ArgTy = S.Context.getRValueReferenceType(ArgTy);
       ArgExprs.push_back(
           new (OpaqueExprAllocator.Allocate<OpaqueValueExpr>())
-          OpaqueValueExpr(Args[I]->getTypeLoc().getBeginLoc(),
-                          ArgTy.getNonLValueExprType(S.Context),
-                          Expr::getValueKindForType(ArgTy)));
+              OpaqueValueExpr(Args[I]->getTypeLoc().getBeginLoc(),
+                              ArgTy.getNonLValueExprType(S.Context),
+                              Expr::getValueKindForType(ArgTy)));
     }
 
-           // Perform the initialization in an unevaluated context within a 
SFINAE
-           // trap at translation unit scope.
+    // Perform the initialization in an unevaluated context within a SFINAE
+    // trap at translation unit scope.
     EnterExpressionEvaluationContext Unevaluated(
         S, Sema::ExpressionEvaluationContext::Unevaluated);
     Sema::SFINAETrap SFINAE(S, /*ForValidityCheck=*/true);
@@ -1411,23 +1414,23 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait 
Kind,
       if (T.getNonReferenceType().hasNonTrivialObjCLifetime())
         return false;
 
-             // The initialization succeeded; now make sure there are no 
non-trivial
-             // calls.
+      // The initialization succeeded; now make sure there are no non-trivial
+      // calls.
       return !Result.get()->hasNonTrivialCall(S.Context);
     }
 
     llvm_unreachable("unhandled type trait");
     return false;
   }
-  default: llvm_unreachable("not a TT");
+  default:
+    llvm_unreachable("not a TT");
   }
 
   return false;
 }
 
 namespace {
-void DiagnoseBuiltinDeprecation(Sema& S, TypeTrait Kind,
-                                SourceLocation KWLoc) {
+void DiagnoseBuiltinDeprecation(Sema &S, TypeTrait Kind, SourceLocation KWLoc) 
{
   TypeTrait Replacement;
   switch (Kind) {
   case UTT_HasNothrowAssign:
@@ -1466,13 +1469,13 @@ void DiagnoseBuiltinDeprecation(Sema& S, TypeTrait Kind,
 bool Sema::CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N) {
   if (Arity && N != Arity) {
     Diag(Loc, diag::err_type_trait_arity)
-    << Arity << 0 << (Arity > 1) << (int)N << SourceRange(Loc);
+        << Arity << 0 << (Arity > 1) << (int)N << SourceRange(Loc);
     return false;
   }
 
   if (!Arity && N == 0) {
     Diag(Loc, diag::err_type_trait_arity)
-    << 1 << 1 << 1 << (int)N << SourceRange(Loc);
+        << 1 << 1 << 1 << (int)N << SourceRange(Loc);
     return false;
   }
   return true;
@@ -1544,15 +1547,17 @@ ExprResult Sema::ActOnTypeTrait(TypeTrait Kind, 
SourceLocation KWLoc,
   return BuildTypeTrait(Kind, KWLoc, ConvertedArgs, RParenLoc);
 }
 
-static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const 
TypeSourceInfo *Lhs,
-                                    const TypeSourceInfo *Rhs, SourceLocation 
KeyLoc) {
+static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT,
+                                    const TypeSourceInfo *Lhs,
+                                    const TypeSourceInfo *Rhs,
+                                    SourceLocation KeyLoc) {
   QualType LhsT = Lhs->getType();
   QualType RhsT = Rhs->getType();
 
   assert(!LhsT->isDependentType() && !RhsT->isDependentType() &&
          "Cannot evaluate traits of dependent types");
 
-  switch(BTT) {
+  switch (BTT) {
   case BTT_IsBaseOf: {
     // C++0x [meta.rel]p2
     // Base is a base class of Derived without regard to cv-qualifiers or
@@ -1580,11 +1585,11 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, 
TypeTrait BTT, const TypeSourceI
       return BaseInterface->isSuperClassOf(DerivedInterface);
     }
 
-    assert(Self.Context.hasSameUnqualifiedType(LhsT, RhsT)
-           == (lhsRecord == rhsRecord));
+    assert(Self.Context.hasSameUnqualifiedType(LhsT, RhsT) ==
+           (lhsRecord == rhsRecord));
 
-           // Unions are never base classes, and never have base classes.
-           // It doesn't matter if they are complete or not. See PR#41843
+    // Unions are never base classes, and never have base classes.
+    // It doesn't matter if they are complete or not. See PR#41843
     if (lhsRecord && lhsRecord->getDecl()->isUnion())
       return false;
     if (rhsRecord && rhsRecord->getDecl()->isUnion())
@@ -1593,10 +1598,10 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, 
TypeTrait BTT, const TypeSourceI
     if (lhsRecord == rhsRecord)
       return true;
 
-           // C++0x [meta.rel]p2:
-           //   If Base and Derived are class types and are different types
-           //   (ignoring possible cv-qualifiers) then Derived shall be a
-           //   complete type.
+    // C++0x [meta.rel]p2:
+    //   If Base and Derived are class types and are different types
+    //   (ignoring possible cv-qualifiers) then Derived shall be a
+    //   complete type.
     if (Self.RequireCompleteType(
             Rhs->getTypeLoc().getBeginLoc(), RhsT,
             diag::err_incomplete_type_used_in_type_trait_expr))
@@ -1682,12 +1687,12 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, 
TypeTrait BTT, const TypeSourceI
             diag::err_incomplete_type_used_in_type_trait_expr))
       return false;
 
-           // cv void is never assignable.
+    // cv void is never assignable.
     if (LhsT->isVoidType() || RhsT->isVoidType())
       return false;
 
-           // Build expressions that emulate the effect of declval<T>() and
-           // declval<U>().
+    // Build expressions that emulate the effect of declval<T>() and
+    // declval<U>().
     if (LhsT->isObjectType() || LhsT->isFunctionType())
       LhsT = Self.Context.getRValueReferenceType(LhsT);
     if (RhsT->isObjectType() || RhsT->isFunctionType())
@@ -1697,18 +1702,18 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, 
TypeTrait BTT, const TypeSourceI
     OpaqueValueExpr Rhs(KeyLoc, RhsT.getNonLValueExprType(Self.Context),
                         Expr::getValueKindForType(RhsT));
 
-           // Attempt the assignment in an unevaluated context within a SFINAE
-           // trap at translation unit scope.
+    // Attempt the assignment in an unevaluated context within a SFINAE
+    // trap at translation unit scope.
     EnterExpressionEvaluationContext Unevaluated(
         Self, Sema::ExpressionEvaluationContext::Unevaluated);
     Sema::SFINAETrap SFINAE(Self, /*ForValidityCheck=*/true);
     Sema::ContextRAII TUContext(Self, Self.Context.getTranslationUnitDecl());
-    ExprResult Result = Self.BuildBinOp(/*S=*/nullptr, KeyLoc, BO_Assign, &Lhs,
-                                        &Rhs);
+    ExprResult Result =
+        Self.BuildBinOp(/*S=*/nullptr, KeyLoc, BO_Assign, &Lhs, &Rhs);
     if (Result.isInvalid())
       return false;
 
-           // Treat the assignment as unused for the purpose of 
-Wdeprecated-volatile.
+    // Treat the assignment as unused for the purpose of -Wdeprecated-volatile.
     Self.CheckUnusedVolatileAssignment(Result.get());
 
     if (SFINAE.hasErrorOccurred())
@@ -1789,10 +1794,8 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, 
TypeTrait BTT, const TypeSourceI
   llvm_unreachable("Unknown type trait or not implemented");
 }
 
-ExprResult Sema::ActOnArrayTypeTrait(ArrayTypeTrait ATT,
-                                     SourceLocation KWLoc,
-                                     ParsedType Ty,
-                                     Expr* DimExpr,
+ExprResult Sema::ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
+                                     ParsedType Ty, Expr *DimExpr,
                                      SourceLocation RParen) {
   TypeSourceInfo *TSInfo;
   QualType T = GetTypeFromParser(Ty, &TSInfo);
@@ -1807,7 +1810,7 @@ static uint64_t EvaluateArrayTypeTrait(Sema &Self, 
ArrayTypeTrait ATT,
                                        SourceLocation KeyLoc) {
   assert(!T->isDependentType() && "Cannot evaluate traits of dependent type");
 
-  switch(ATT) {
+  switch (ATT) {
   case ATT_ArrayRank:
     if (T->isArrayType()) {
       unsigned Dim = 0;
@@ -1828,7 +1831,7 @@ static uint64_t EvaluateArrayTypeTrait(Sema &Self, 
ArrayTypeTrait ATT,
       return 0;
     if (Value.isSigned() && Value.isNegative()) {
       Self.Diag(KeyLoc, diag::err_dimension_expr_not_constant_integer)
-      << DimExpr->getSourceRange();
+          << DimExpr->getSourceRange();
       return 0;
     }
     Dim = Value.getLimitedValue();
@@ -1846,7 +1849,8 @@ static uint64_t EvaluateArrayTypeTrait(Sema &Self, 
ArrayTypeTrait ATT,
       }
 
       if (Matched && T->isArrayType()) {
-        if (const ConstantArrayType *CAT = 
Self.Context.getAsConstantArrayType(T))
+        if (const ConstantArrayType *CAT =
+                Self.Context.getAsConstantArrayType(T))
           return CAT->getLimitedSize();
       }
     }
@@ -1856,32 +1860,28 @@ static uint64_t EvaluateArrayTypeTrait(Sema &Self, 
ArrayTypeTrait ATT,
   llvm_unreachable("Unknown type trait or not implemented");
 }
 
-ExprResult Sema::BuildArrayTypeTrait(ArrayTypeTrait ATT,
-                                     SourceLocation KWLoc,
-                                     TypeSourceInfo *TSInfo,
-                                     Expr* DimExpr,
+ExprResult Sema::BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
+                                     TypeSourceInfo *TSInfo, Expr *DimExpr,
                                      SourceLocation RParen) {
   QualType T = TSInfo->getType();
 
-         // FIXME: This should likely be tracked as an APInt to remove any host
-         // assumptions about the width of size_t on the target.
+  // FIXME: This should likely be tracked as an APInt to remove any host
+  // assumptions about the width of size_t on the target.
   uint64_t Value = 0;
   if (!T->isDependentType())
     Value = EvaluateArrayTypeTrait(*this, ATT, T, DimExpr, KWLoc);
 
-         // While the specification for these traits from the Embarcadero C++
-         // compiler's documentation says the return type is 'unsigned int', 
Clang
-         // returns 'size_t'. On Windows, the primary platform for the 
Embarcadero
-         // compiler, there is no difference. On several other platforms this 
is an
-         // important distinction.
+  // While the specification for these traits from the Embarcadero C++
+  // compiler's documentation says the return type is 'unsigned int', Clang
+  // returns 'size_t'. On Windows, the primary platform for the Embarcadero
+  // compiler, there is no difference. On several other platforms this is an
+  // important distinction.
   return new (Context) ArrayTypeTraitExpr(KWLoc, ATT, TSInfo, Value, DimExpr,
                                           RParen, Context.getSizeType());
 }
 
-ExprResult Sema::ActOnExpressionTrait(ExpressionTrait ET,
-                                      SourceLocation KWLoc,
-                                      Expr *Queried,
-                                      SourceLocation RParen) {
+ExprResult Sema::ActOnExpressionTrait(ExpressionTrait ET, SourceLocation KWLoc,
+                                      Expr *Queried, SourceLocation RParen) {
   // If error parsing the expression, ignore.
   if (!Queried)
     return ExprError();
@@ -1893,22 +1893,22 @@ ExprResult Sema::ActOnExpressionTrait(ExpressionTrait 
ET,
 
 static bool EvaluateExpressionTrait(ExpressionTrait ET, Expr *E) {
   switch (ET) {
-  case ET_IsLValueExpr: return E->isLValue();
+  case ET_IsLValueExpr:
+    return E->isLValue();
   case ET_IsRValueExpr:
     return E->isPRValue();
   }
   llvm_unreachable("Expression trait not covered by switch");
 }
 
-ExprResult Sema::BuildExpressionTrait(ExpressionTrait ET,
-                                      SourceLocation KWLoc,
-                                      Expr *Queried,
-                                      SourceLocation RParen) {
+ExprResult Sema::BuildExpressionTrait(ExpressionTrait ET, SourceLocation KWLoc,
+                                      Expr *Queried, SourceLocation RParen) {
   if (Queried->isTypeDependent()) {
     // Delay type-checking for type-dependent expressions.
   } else if (Queried->hasPlaceholderType()) {
     ExprResult PE = CheckPlaceholderExpr(Queried);
-    if (PE.isInvalid()) return ExprError();
+    if (PE.isInvalid())
+      return ExprError();
     return BuildExpressionTrait(ET, KWLoc, PE.get(), RParen);
   }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/141245
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to