Author: Vlad Serebrennikov Date: 2025-05-02T07:39:54+03:00 New Revision: 09fb9adbd2a432a83e451ee9156faceb9d76e9aa
URL: https://github.com/llvm/llvm-project/commit/09fb9adbd2a432a83e451ee9156faceb9d76e9aa DIFF: https://github.com/llvm/llvm-project/commit/09fb9adbd2a432a83e451ee9156faceb9d76e9aa.diff LOG: [clang][NFC] Convert `Sema::NonTrivialCUnionContext` to scoped enum Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaType.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index f3d03ea0d737a..aaff8e656b746 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -523,6 +523,29 @@ enum class BuiltinCountedByRefKind { BinaryExpr, }; +// Contexts where using non-trivial C union types can be disallowed. This is +// passed to err_non_trivial_c_union_in_invalid_context. +enum class NonTrivialCUnionContext { + // Function parameter. + FunctionParam, + // Function return. + FunctionReturn, + // Default-initialized object. + DefaultInitializedObject, + // Variable with automatic storage duration. + AutoVar, + // Initializer expression that might copy from another object. + CopyInit, + // Assignment. + Assignment, + // Compound literal. + CompoundLiteral, + // Block capture. + BlockCapture, + // lvalue-to-rvalue conversion of volatile type. + LValueToRValueVolatile, +}; + /// Describes the result of the name lookup and resolution performed /// by \c Sema::ClassifyName(). enum class NameClassificationKind { @@ -3750,29 +3773,6 @@ class Sema final : public SemaBase { const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC); - // Contexts where using non-trivial C union types can be disallowed. This is - // passed to err_non_trivial_c_union_in_invalid_context. - enum NonTrivialCUnionContext { - // Function parameter. - NTCUC_FunctionParam, - // Function return. - NTCUC_FunctionReturn, - // Default-initialized object. - NTCUC_DefaultInitializedObject, - // Variable with automatic storage duration. - NTCUC_AutoVar, - // Initializer expression that might copy from another object. - NTCUC_CopyInit, - // Assignment. - NTCUC_Assignment, - // Compound literal. - NTCUC_CompoundLiteral, - // Block capture. - NTCUC_BlockCapture, - // lvalue-to-rvalue conversion of volatile type. - NTCUC_LValueToRValueVolatile, - }; - /// Emit diagnostics if the initializer or any of its explicit or /// implicitly-generated subexpressions require copying or /// default-initializing a type that is or contains a C union type that is diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 39e370a03afd0..b9d33d67ca7e4 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -2379,8 +2379,8 @@ static void markEscapingByrefs(const FunctionScopeInfo &FSI, Sema &S) { CapType.hasNonTrivialToPrimitiveCopyCUnion()) S.checkNonTrivialCUnion(BC.getVariable()->getType(), BD->getCaretLocation(), - Sema::NTCUC_BlockCapture, - Sema::NTCUK_Destruct|Sema::NTCUK_Copy); + NonTrivialCUnionContext::BlockCapture, + Sema::NTCUK_Destruct | Sema::NTCUK_Copy); } } diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a3285e8f6f5a2..85c5f4c375c3d 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7624,7 +7624,7 @@ NamedDecl *Sema::ActOnVariableDeclarator( if (NewVD->getType().hasNonTrivialToPrimitiveDestructCUnion() && NewVD->hasLocalStorage()) checkNonTrivialCUnion(NewVD->getType(), NewVD->getLocation(), - NTCUC_AutoVar, NTCUK_Destruct); + NonTrivialCUnionContext::AutoVar, NTCUK_Destruct); } else { bool Invalid = false; // Match up the template parameter lists with the scope specifier, then @@ -10529,9 +10529,9 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, if (NewFD->getReturnType().hasNonTrivialToPrimitiveDestructCUnion() || NewFD->getReturnType().hasNonTrivialToPrimitiveCopyCUnion()) - checkNonTrivialCUnion(NewFD->getReturnType(), - NewFD->getReturnTypeSourceRange().getBegin(), - NTCUC_FunctionReturn, NTCUK_Destruct|NTCUK_Copy); + checkNonTrivialCUnion( + NewFD->getReturnType(), NewFD->getReturnTypeSourceRange().getBegin(), + NonTrivialCUnionContext::FunctionReturn, NTCUK_Destruct | NTCUK_Copy); } else { // C++11 [replacement.functions]p3: // The program's definitions shall not be specified as inline. @@ -13188,7 +13188,8 @@ void Sema::checkNonTrivialCUnionInInitializer(const Expr *Init, if (isa<ImplicitValueInitExpr>(Init)) { if (InitType.hasNonTrivialToPrimitiveDefaultInitializeCUnion()) - checkNonTrivialCUnion(InitType, Loc, NTCUC_DefaultInitializedObject, + checkNonTrivialCUnion(InitType, Loc, + NonTrivialCUnionContext::DefaultInitializedObject, NTCUK_Init); } else { // Assume all other explicit initializers involving copying some existing @@ -13196,7 +13197,8 @@ void Sema::checkNonTrivialCUnionInInitializer(const Expr *Init, // TODO: ignore any explicit initializers where we can guarantee // copy-elision. if (InitType.hasNonTrivialToPrimitiveCopyCUnion()) - checkNonTrivialCUnion(InitType, Loc, NTCUC_CopyInit, NTCUK_Copy); + checkNonTrivialCUnion(InitType, Loc, NonTrivialCUnionContext::CopyInit, + NTCUK_Copy); } } @@ -13220,7 +13222,7 @@ struct DiagNonTrivalCUnionDefaultInitializeVisitor DiagNonTrivalCUnionDefaultInitializeVisitor( QualType OrigTy, SourceLocation OrigLoc, - Sema::NonTrivialCUnionContext UseContext, Sema &S) + NonTrivialCUnionContext UseContext, Sema &S) : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {} void visitWithKind(QualType::PrimitiveDefaultInitializeKind PDIK, QualType QT, @@ -13274,7 +13276,7 @@ struct DiagNonTrivalCUnionDefaultInitializeVisitor // non-trivial C union. QualType OrigTy; SourceLocation OrigLoc; - Sema::NonTrivialCUnionContext UseContext; + NonTrivialCUnionContext UseContext; Sema &S; }; @@ -13283,9 +13285,10 @@ struct DiagNonTrivalCUnionDestructedTypeVisitor using Super = DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>; - DiagNonTrivalCUnionDestructedTypeVisitor( - QualType OrigTy, SourceLocation OrigLoc, - Sema::NonTrivialCUnionContext UseContext, Sema &S) + DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy, + SourceLocation OrigLoc, + NonTrivialCUnionContext UseContext, + Sema &S) : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {} void visitWithKind(QualType::DestructionKind DK, QualType QT, @@ -13341,7 +13344,7 @@ struct DiagNonTrivalCUnionDestructedTypeVisitor // non-trivial C union. QualType OrigTy; SourceLocation OrigLoc; - Sema::NonTrivialCUnionContext UseContext; + NonTrivialCUnionContext UseContext; Sema &S; }; @@ -13350,8 +13353,7 @@ struct DiagNonTrivalCUnionCopyVisitor using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>; DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc, - Sema::NonTrivialCUnionContext UseContext, - Sema &S) + NonTrivialCUnionContext UseContext, Sema &S) : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {} void visitWithKind(QualType::PrimitiveCopyKind PCK, QualType QT, @@ -13415,7 +13417,7 @@ struct DiagNonTrivalCUnionCopyVisitor // non-trivial C union. QualType OrigTy; SourceLocation OrigLoc; - Sema::NonTrivialCUnionContext UseContext; + NonTrivialCUnionContext UseContext; Sema &S; }; @@ -14214,8 +14216,8 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) { if (!Var->isInvalidDecl() && DefKind != VarDecl::DeclarationOnly && Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion()) checkNonTrivialCUnion(Var->getType(), Var->getLocation(), - NTCUC_DefaultInitializedObject, NTCUK_Init); - + NonTrivialCUnionContext::DefaultInitializedObject, + NTCUK_Init); switch (DefKind) { case VarDecl::Definition: @@ -15487,7 +15489,8 @@ ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc, if (New->getType().hasNonTrivialToPrimitiveDestructCUnion() || New->getType().hasNonTrivialToPrimitiveCopyCUnion()) checkNonTrivialCUnion(New->getType(), New->getLocation(), - NTCUC_FunctionParam, NTCUK_Destruct|NTCUK_Copy); + NonTrivialCUnionContext::FunctionParam, + NTCUK_Destruct | NTCUK_Copy); // Parameter declarators cannot be interface types. All ObjC objects are // passed by reference. diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0cd86dc54b0ab..205556424c67f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -7236,7 +7236,8 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, // to destruct. if (E->getType().hasNonTrivialToPrimitiveDestructCUnion()) checkNonTrivialCUnion(E->getType(), E->getExprLoc(), - NTCUC_CompoundLiteral, NTCUK_Destruct); + NonTrivialCUnionContext::CompoundLiteral, + NTCUK_Destruct); // Diagnose jumps that enter or exit the lifetime of the compound literal. if (literalType.isDestructedType()) { @@ -15041,7 +15042,7 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc, if (LHS.get()->getType().hasNonTrivialToPrimitiveCopyCUnion()) checkNonTrivialCUnion(LHS.get()->getType(), LHS.get()->getExprLoc(), - NTCUC_Assignment, NTCUK_Copy); + NonTrivialCUnionContext::Assignment, NTCUK_Copy); } RecordModifiableNonNullParam(*this, LHS.get()); break; @@ -16531,8 +16532,9 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, if (RetTy.hasNonTrivialToPrimitiveDestructCUnion() || RetTy.hasNonTrivialToPrimitiveCopyCUnion()) - checkNonTrivialCUnion(RetTy, BD->getCaretLocation(), NTCUC_FunctionReturn, - NTCUK_Destruct|NTCUK_Copy); + checkNonTrivialCUnion(RetTy, BD->getCaretLocation(), + NonTrivialCUnionContext::FunctionReturn, + NTCUK_Destruct | NTCUK_Copy); PopDeclContext(); @@ -19807,8 +19809,8 @@ ExprResult Sema::CheckLValueToRValueConversionOperand(Expr *E) { (E->getType().hasNonTrivialToPrimitiveDestructCUnion() || E->getType().hasNonTrivialToPrimitiveCopyCUnion())) checkNonTrivialCUnion(E->getType(), E->getExprLoc(), - Sema::NTCUC_LValueToRValueVolatile, - NTCUK_Destruct|NTCUK_Copy); + NonTrivialCUnionContext::LValueToRValueVolatile, + NTCUK_Destruct | NTCUK_Copy); // C++2a [basic.def.odr]p4: // [...] an expression of non-volatile-qualified non-class type to which diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index d103a10f17a71..6406415c371c2 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2560,8 +2560,8 @@ bool Sema::CheckFunctionReturnType(QualType T, SourceLocation Loc) { if (T.hasNonTrivialToPrimitiveDestructCUnion() || T.hasNonTrivialToPrimitiveCopyCUnion()) - checkNonTrivialCUnion(T, Loc, NTCUC_FunctionReturn, - NTCUK_Destruct|NTCUK_Copy); + checkNonTrivialCUnion(T, Loc, NonTrivialCUnionContext::FunctionReturn, + NTCUK_Destruct | NTCUK_Copy); // C++2a [dcl.fct]p12: // A volatile-qualified return type is deprecated _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits