diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 8054be1bb4e88..72321c204ce96 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -9,31 +9,16 @@ // This file defines the language options. Users of this file must // define the LANGOPT macro to make use of this information. The arguments to // the macro are: -// LANGOPT(Name, Bits, DefaultValue, Description) +// LANGOPT(Name, Bits, DefaultValue, Compatibility, Description) // Note that the DefaultValue must be a constant value (literal or enumeration); // it cannot depend on the value of another language option. // // Optionally, the user may also define: // -// BENIGN_LANGOPT: for options that don't affect the construction of the AST in -// any way (that is, the value can be different between an implicit module -// and the user of that module). -// -// COMPATIBLE_LANGOPT: for options that affect the construction of the AST in -// a way that doesn't prevent interoperability (that is, the value can be -// different between an explicit module and the user of that module). -// // ENUM_LANGOPT: for options that have enumeration, rather than unsigned, type. // // VALUE_LANGOPT: for options that describe a value rather than a flag. // -// BENIGN_ENUM_LANGOPT, COMPATIBLE_ENUM_LANGOPT, -// BENIGN_VALUE_LANGOPT, COMPATIBLE_VALUE_LANGOPT: combinations of the above. -// -// FIXME: Clients should be able to more easily select whether they want -// different levels of compatibility versus how to handle different kinds -// of option. -// // The Description field should be a noun phrase, for instance "frobbing all // widgets" or "C's implicit blintz feature". //===----------------------------------------------------------------------===// @@ -42,507 +27,471 @@ # error Define the LANGOPT macro to handle language options #endif -#ifndef COMPATIBLE_LANGOPT -# define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ - LANGOPT(Name, Bits, Default, Description) -#endif - -#ifndef BENIGN_LANGOPT -# define BENIGN_LANGOPT(Name, Bits, Default, Description) \ - COMPATIBLE_LANGOPT(Name, Bits, Default, Description) -#endif - #ifndef ENUM_LANGOPT -# define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - LANGOPT(Name, Bits, Default, Description) -#endif - -#ifndef COMPATIBLE_ENUM_LANGOPT -# define COMPATIBLE_ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - ENUM_LANGOPT(Name, Type, Bits, Default, Description) -#endif - -#ifndef BENIGN_ENUM_LANGOPT -# define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - COMPATIBLE_ENUM_LANGOPT(Name, Type, Bits, Default, Description) +# define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + LANGOPT(Name, Bits, Default, Compatibility, Description) #endif #ifndef VALUE_LANGOPT -# define VALUE_LANGOPT(Name, Bits, Default, Description) \ - LANGOPT(Name, Bits, Default, Description) -#endif - -#ifndef COMPATIBLE_VALUE_LANGOPT -# define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ - VALUE_LANGOPT(Name, Bits, Default, Description) -#endif - -#ifndef BENIGN_VALUE_LANGOPT -# define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description) \ - COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) +# define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \ + LANGOPT(Name, Bits, Default, Compatibility, Description) #endif -// FIXME: A lot of the BENIGN_ options should be COMPATIBLE_ instead. -LANGOPT(C99 , 1, 0, "C99") -LANGOPT(C11 , 1, 0, "C11") -LANGOPT(C17 , 1, 0, "C17") -LANGOPT(C23 , 1, 0, "C23") -LANGOPT(C2y , 1, 0, "C2y") -LANGOPT(MSVCCompat , 1, 0, "Microsoft Visual C++ full compatibility mode") -LANGOPT(Kernel , 1, 0, "Kernel mode") -LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ extensions") -LANGOPT(ZOSExt , 1, 0, "z/OS extensions") -LANGOPT(AsmBlocks , 1, 0, "Microsoft inline asm blocks") -LANGOPT(Borland , 1, 0, "Borland extensions") -LANGOPT(CPlusPlus , 1, 0, "C++") -LANGOPT(CPlusPlus11 , 1, 0, "C++11") -LANGOPT(CPlusPlus14 , 1, 0, "C++14") -LANGOPT(CPlusPlus17 , 1, 0, "C++17") -LANGOPT(CPlusPlus20 , 1, 0, "C++20") -LANGOPT(CPlusPlus23 , 1, 0, "C++23") -LANGOPT(CPlusPlus26 , 1, 0, "C++26") -LANGOPT(ObjC , 1, 0, "Objective-C") -BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, - "Objective-C auto-synthesized properties") -BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0, - "Encoding extended block type signature") -BENIGN_LANGOPT(EncodeCXXClassTemplateSpec , 1, 0, - "Fully encode c++ class template specialization") -BENIGN_LANGOPT(ObjCInferRelatedResultType , 1, 1, - "Objective-C related result type inference") -LANGOPT(AppExt , 1, 0, "Objective-C App Extension") -LANGOPT(Trigraphs , 1, 0,"trigraphs") -LANGOPT(LineComment , 1, 0, "'//' comments") -LANGOPT(Bool , 1, 0, "bool, true, and false keywords") -LANGOPT(Half , 1, 0, "half keyword") -LANGOPT(WChar , 1, 0, "wchar_t keyword") -LANGOPT(Char8 , 1, 0, "char8_t keyword") -LANGOPT(IEEE128 , 1, 0, "__ieee128 keyword") -LANGOPT(DeclSpecKeyword , 1, 0, "__declspec keyword") -BENIGN_LANGOPT(DollarIdents , 1, 1, "'$' in identifiers") -BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode") -LANGOPT(GNUMode , 1, 1, "GNU extensions") -LANGOPT(GNUKeywords , 1, 1, "GNU keywords") -VALUE_LANGOPT(GNUCVersion , 32, 0, "GNU C compatibility version") -LANGOPT(DisableKNRFunctions, 1, 0, "require function types to have a prototype") -LANGOPT(Digraphs , 1, 0, "digraphs") -BENIGN_LANGOPT(HexFloats , 1, 0, "C99 hexadecimal float constants") -LANGOPT(CXXOperatorNames , 1, 0, "C++ operator name keywords") -LANGOPT(AppleKext , 1, 0, "Apple kext support") -BENIGN_LANGOPT(PascalStrings, 1, 0, "Pascal string support") -LANGOPT(WritableStrings , 1, 0, "writable string support") -LANGOPT(ConstStrings , 1, 0, "const-qualified string support") +// FIXME: A lot of the Benign options should be Compatible instead. +LANGOPT(C99 , 1, 0, NotCompatible, "C99") +LANGOPT(C11 , 1, 0, NotCompatible, "C11") +LANGOPT(C17 , 1, 0, NotCompatible, "C17") +LANGOPT(C23 , 1, 0, NotCompatible, "C23") +LANGOPT(C2y , 1, 0, NotCompatible, "C2y") +LANGOPT(MSVCCompat , 1, 0, NotCompatible, "Microsoft Visual C++ full compatibility mode") +LANGOPT(Kernel , 1, 0, NotCompatible, "Kernel mode") +LANGOPT(MicrosoftExt , 1, 0, NotCompatible, "Microsoft C++ extensions") +LANGOPT(ZOSExt , 1, 0, NotCompatible, "z/OS extensions") +LANGOPT(AsmBlocks , 1, 0, NotCompatible, "Microsoft inline asm blocks") +LANGOPT(Borland , 1, 0, NotCompatible, "Borland extensions") +LANGOPT(CPlusPlus , 1, 0, NotCompatible, "C++") +LANGOPT(CPlusPlus11 , 1, 0, NotCompatible, "C++11") +LANGOPT(CPlusPlus14 , 1, 0, NotCompatible, "C++14") +LANGOPT(CPlusPlus17 , 1, 0, NotCompatible, "C++17") +LANGOPT(CPlusPlus20 , 1, 0, NotCompatible, "C++20") +LANGOPT(CPlusPlus23 , 1, 0, NotCompatible, "C++23") +LANGOPT(CPlusPlus26 , 1, 0, NotCompatible, "C++26") +LANGOPT(ObjC , 1, 0, NotCompatible, "Objective-C") +LANGOPT(ObjCDefaultSynthProperties , 1, 0, Benign, + "Objective-C auto-synthesized properties") +LANGOPT(EncodeExtendedBlockSig , 1, 0, Benign, + "Encoding extended block type signature") +LANGOPT(EncodeCXXClassTemplateSpec , 1, 0, Benign, + "Fully encode c++ class template specialization") +LANGOPT(ObjCInferRelatedResultType , 1, 1, Benign, + "Objective-C related result type inference") +LANGOPT(AppExt , 1, 0, NotCompatible, "Objective-C App Extension") +LANGOPT(Trigraphs , 1, 0, NotCompatible, "trigraphs") +LANGOPT(LineComment , 1, 0, NotCompatible, "'//' comments") +LANGOPT(Bool , 1, 0, NotCompatible, "bool, true, and false keywords") +LANGOPT(Half , 1, 0, NotCompatible, "half keyword") +LANGOPT(WChar , 1, 0, NotCompatible, "wchar_t keyword") +LANGOPT(Char8 , 1, 0, NotCompatible, "char8_t keyword") +LANGOPT(IEEE128 , 1, 0, NotCompatible, "__ieee128 keyword") +LANGOPT(DeclSpecKeyword , 1, 0, NotCompatible, "__declspec keyword") +LANGOPT(DollarIdents , 1, 1, Benign, "'$' in identifiers") +LANGOPT(AsmPreprocessor , 1, 0, Benign, "preprocessor in asm mode") +LANGOPT(GNUMode , 1, 1, NotCompatible, "GNU extensions") +LANGOPT(GNUKeywords , 1, 1, NotCompatible, "GNU keywords") +VALUE_LANGOPT(GNUCVersion , 32, 0, NotCompatible, "GNU C compatibility version") +LANGOPT(DisableKNRFunctions, 1, 0, NotCompatible, "require function types to have a prototype") +LANGOPT(Digraphs , 1, 0, NotCompatible, "digraphs") +LANGOPT(HexFloats , 1, 0, Benign, "C99 hexadecimal float constants") +LANGOPT(CXXOperatorNames , 1, 0, NotCompatible, "C++ operator name keywords") +LANGOPT(AppleKext , 1, 0, NotCompatible, "Apple kext support") +LANGOPT(PascalStrings , 1, 0, Benign, "Pascal string support") +LANGOPT(WritableStrings , 1, 0, NotCompatible, "writable string support") +LANGOPT(ConstStrings , 1, 0, NotCompatible, "const-qualified string support") ENUM_LANGOPT(LaxVectorConversions, LaxVectorConversionKind, 2, - LaxVectorConversionKind::All, "lax vector conversions") + LaxVectorConversionKind::All, NotCompatible, "lax vector conversions") ENUM_LANGOPT(AltivecSrcCompat, AltivecSrcCompatKind, 2, - AltivecSrcCompatKind::Default, "Altivec source compatibility") -LANGOPT(ConvergentFunctions, 1, 1, "Assume convergent functions") -LANGOPT(AltiVec , 1, 0, "AltiVec-style vector initializers") -LANGOPT(ZVector , 1, 0, "System z vector extensions") -LANGOPT(Exceptions , 1, 0, "exception handling") -LANGOPT(ObjCExceptions , 1, 0, "Objective-C exceptions") -LANGOPT(CXXExceptions , 1, 0, "C++ exceptions") -LANGOPT(EHAsynch , 1, 0, "C/C++ EH Asynch exceptions") + AltivecSrcCompatKind::Default, NotCompatible, "Altivec source compatibility") +LANGOPT(ConvergentFunctions, 1, 1, NotCompatible, "Assume convergent functions") +LANGOPT(AltiVec , 1, 0, NotCompatible, "AltiVec-style vector initializers") +LANGOPT(ZVector , 1, 0, NotCompatible, "System z vector extensions") +LANGOPT(Exceptions , 1, 0, NotCompatible, "exception handling") +LANGOPT(ObjCExceptions , 1, 0, NotCompatible, "Objective-C exceptions") +LANGOPT(CXXExceptions , 1, 0, NotCompatible, "C++ exceptions") +LANGOPT(EHAsynch , 1, 0, NotCompatible, "C/C++ EH Asynch exceptions") ENUM_LANGOPT(ExceptionHandling, ExceptionHandlingKind, 3, - ExceptionHandlingKind::None, "exception handling") -LANGOPT(IgnoreExceptions , 1, 0, "ignore exceptions") -LANGOPT(ExternCNoUnwind , 1, 0, "Assume extern C functions don't unwind") -LANGOPT(AssumeNothrowExceptionDtor , 1, 0, "Assume exception object's destructor is nothrow") -LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation") -LANGOPT(RTTI , 1, 1, "run-time type information") -LANGOPT(RTTIData , 1, 1, "emit run-time type information data") -LANGOPT(MSBitfields , 1, 0, "Microsoft-compatible structure layout") -LANGOPT(MSVolatile , 1, 0, "Microsoft-compatible volatile loads and stores") -LANGOPT(Freestanding, 1, 0, "freestanding implementation") -LANGOPT(NoBuiltin , 1, 0, "disable builtin functions") -LANGOPT(NoMathBuiltin , 1, 0, "disable math builtin functions") -LANGOPT(GNUAsm , 1, 1, "GNU-style inline assembly") -LANGOPT(Coroutines , 1, 0, "C++20 coroutines") -LANGOPT(CoroAlignedAllocation, 1, 0, "prefer Aligned Allocation according to P2014 Option 2") -LANGOPT(DllExportInlines , 1, 1, "dllexported classes dllexport inline methods") -LANGOPT(ExperimentalLibrary, 1, 0, "enable unstable and experimental library features") - -LANGOPT(PointerAuthIntrinsics, 1, 0, "pointer authentication intrinsics") -LANGOPT(PointerAuthCalls , 1, 0, "function pointer authentication") -LANGOPT(PointerAuthReturns, 1, 0, "return pointer authentication") -LANGOPT(PointerAuthIndirectGotos, 1, 0, "indirect gotos pointer authentication") -LANGOPT(PointerAuthAuthTraps, 1, 0, "pointer authentication failure traps") -LANGOPT(PointerAuthVTPtrAddressDiscrimination, 1, 0, "incorporate address discrimination in authenticated vtable pointers") -LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, "incorporate type discrimination in authenticated vtable pointers") -LANGOPT(PointerAuthTypeInfoVTPtrDiscrimination, 1, 0, "incorporate type and address discrimination in authenticated vtable pointers for std::type_info") -BENIGN_LANGOPT(PointerAuthFunctionTypeDiscrimination, 1, 0, - "Use type discrimination when signing function pointers") -LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays") -LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0, + ExceptionHandlingKind::None, NotCompatible, "exception handling") +LANGOPT(IgnoreExceptions , 1, 0, NotCompatible, "ignore exceptions") +LANGOPT(ExternCNoUnwind , 1, 0, NotCompatible, "Assume extern C functions don't unwind") +LANGOPT(AssumeNothrowExceptionDtor , 1, 0, NotCompatible, "Assume exception object's destructor is nothrow") +LANGOPT(TraditionalCPP , 1, 0, NotCompatible, "traditional CPP emulation") +LANGOPT(RTTI , 1, 1, NotCompatible, "run-time type information") +LANGOPT(RTTIData , 1, 1, NotCompatible, "emit run-time type information data") +LANGOPT(MSBitfields , 1, 0, NotCompatible, "Microsoft-compatible structure layout") +LANGOPT(MSVolatile , 1, 0, NotCompatible, "Microsoft-compatible volatile loads and stores") +LANGOPT(Freestanding , 1, 0, NotCompatible, "freestanding implementation") +LANGOPT(NoBuiltin , 1, 0, NotCompatible, "disable builtin functions") +LANGOPT(NoMathBuiltin , 1, 0, NotCompatible, "disable math builtin functions") +LANGOPT(GNUAsm , 1, 1, NotCompatible, "GNU-style inline assembly") +LANGOPT(Coroutines , 1, 0, NotCompatible, "C++20 coroutines") +LANGOPT(CoroAlignedAllocation, 1, 0, NotCompatible, "prefer Aligned Allocation according to P2014 Option 2") +LANGOPT(DllExportInlines , 1, 1, NotCompatible, "dllexported classes dllexport inline methods") +LANGOPT(ExperimentalLibrary, 1, 0, NotCompatible, "enable unstable and experimental library features") + +LANGOPT(PointerAuthIntrinsics, 1, 0, NotCompatible, "pointer authentication intrinsics") +LANGOPT(PointerAuthCalls , 1, 0, NotCompatible, "function pointer authentication") +LANGOPT(PointerAuthReturns, 1, 0, NotCompatible, "return pointer authentication") +LANGOPT(PointerAuthIndirectGotos, 1, 0, NotCompatible, "indirect gotos pointer authentication") +LANGOPT(PointerAuthAuthTraps, 1, 0, NotCompatible, "pointer authentication failure traps") +LANGOPT(PointerAuthVTPtrAddressDiscrimination, 1, 0, NotCompatible, "incorporate address discrimination in authenticated vtable pointers") +LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, NotCompatible, "incorporate type discrimination in authenticated vtable pointers") +LANGOPT(PointerAuthTypeInfoVTPtrDiscrimination, 1, 0, NotCompatible, "incorporate type and address discrimination in authenticated vtable pointers for std::type_info") +LANGOPT(PointerAuthFunctionTypeDiscrimination, 1, 0, Benign, + "Use type discrimination when signing function pointers") +LANGOPT(PointerAuthInitFini, 1, 0, NotCompatible, "sign function pointers in init/fini arrays") +LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0, NotCompatible, "incorporate address discrimination in authenticated function pointers in init/fini arrays") -LANGOPT(PointerAuthELFGOT, 1, 0, "authenticate pointers from GOT") -LANGOPT(AArch64JumpTableHardening, 1, 0, "use hardened lowering for jump-table dispatch") - -LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension for all language standard modes") -LANGOPT(ExperimentalLateParseAttributes, 1, 0, "experimental late parsing of attributes") - -COMPATIBLE_LANGOPT(RecoveryAST, 1, 1, "Preserve expressions in AST when encountering errors") -COMPATIBLE_LANGOPT(RecoveryASTType, 1, 1, "Preserve the type in recovery expressions") - -BENIGN_LANGOPT(ThreadsafeStatics , 1, 1, "thread-safe static initializers") -LANGOPT(POSIXThreads , 1, 0, "POSIX thread support") -LANGOPT(Blocks , 1, 0, "blocks extension to C") -BENIGN_LANGOPT(EmitAllDecls , 1, 0, "emitting all declarations") -LANGOPT(MathErrno , 1, 1, "errno in math functions") -LANGOPT(Modules , 1, 0, "modules semantics") -COMPATIBLE_LANGOPT(CPlusPlusModules, 1, 0, "C++ modules syntax") -LANGOPT(SkipODRCheckInGMF, 1, 0, "Skip ODR checks for decls in the global module fragment") -LANGOPT(BuiltinHeadersInSystemModules, 1, 0, "builtin headers belong to system modules, and _Builtin_ modules are ignored for cstdlib headers") -BENIGN_ENUM_LANGOPT(CompilingModule, CompilingModuleKind, 3, CMK_None, - "compiling a module interface") -BENIGN_LANGOPT(CompilingPCH, 1, 0, "building a pch") -BENIGN_LANGOPT(BuildingPCHWithObjectFile, 1, 0, "building a pch which has a corresponding object file") -BENIGN_LANGOPT(CacheGeneratedPCH, 1, 0, "cache generated PCH files in memory") -BENIGN_LANGOPT(PCHInstantiateTemplates, 1, 0, "instantiate templates while building a PCH") -COMPATIBLE_LANGOPT(ModulesDeclUse , 1, 0, "require declaration of module uses") -BENIGN_LANGOPT(ModulesSearchAll , 1, 1, "searching even non-imported modules to find unresolved references") -COMPATIBLE_LANGOPT(ModulesStrictDeclUse, 1, 0, "requiring declaration of module uses and all headers to be in modules") -COMPATIBLE_LANGOPT(ModulesValidateTextualHeaderIncludes, 1, 1, "validation of textual header includes") -BENIGN_LANGOPT(ModulesErrorRecovery, 1, 1, "automatically importing modules as needed when performing error recovery") -BENIGN_LANGOPT(ImplicitModules, 1, 1, "building modules that are not specified via -fmodule-file") -COMPATIBLE_LANGOPT(ModulesLocalVisibility, 1, 0, "local submodule visibility") -COMPATIBLE_LANGOPT(Optimize , 1, 0, "__OPTIMIZE__ predefined macro") -COMPATIBLE_LANGOPT(OptimizeSize , 1, 0, "__OPTIMIZE_SIZE__ predefined macro") -COMPATIBLE_LANGOPT(Static , 1, 0, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)") -VALUE_LANGOPT(PackStruct , 32, 0, +LANGOPT(PointerAuthELFGOT, 1, 0, NotCompatible, "authenticate pointers from GOT") +LANGOPT(AArch64JumpTableHardening, 1, 0, NotCompatible, "use hardened lowering for jump-table dispatch") + +LANGOPT(DoubleSquareBracketAttributes, 1, 0, NotCompatible, "'[[]]' attributes extension for all language standard modes") +LANGOPT(ExperimentalLateParseAttributes, 1, 0, NotCompatible, "experimental late parsing of attributes") + +LANGOPT(RecoveryAST, 1, 1, Compatible, "Preserve expressions in AST when encountering errors") +LANGOPT(RecoveryASTType, 1, 1, Compatible, "Preserve the type in recovery expressions") + +LANGOPT(ThreadsafeStatics , 1, 1, Benign, "thread-safe static initializers") +LANGOPT(POSIXThreads , 1, 0, NotCompatible, "POSIX thread support") +LANGOPT(Blocks , 1, 0, NotCompatible, "blocks extension to C") +LANGOPT(EmitAllDecls , 1, 0, Benign, "emitting all declarations") +LANGOPT(MathErrno , 1, 1, NotCompatible, "errno in math functions") +LANGOPT(Modules , 1, 0, NotCompatible, "modules semantics") +LANGOPT(CPlusPlusModules , 1, 0, Compatible, "C++ modules syntax") +LANGOPT(SkipODRCheckInGMF , 1, 0, NotCompatible, "Skip ODR checks for decls in the global module fragment") +LANGOPT(BuiltinHeadersInSystemModules, 1, 0, NotCompatible, "builtin headers belong to system modules, and _Builtin_ modules are ignored for cstdlib headers") +ENUM_LANGOPT(CompilingModule, CompilingModuleKind, 3, CMK_None, Benign, + "compiling a module interface") +LANGOPT(CompilingPCH, 1, 0, Benign, "building a pch") +LANGOPT(BuildingPCHWithObjectFile, 1, 0, Benign, "building a pch which has a corresponding object file") +LANGOPT(CacheGeneratedPCH, 1, 0, Benign, "cache generated PCH files in memory") +LANGOPT(PCHInstantiateTemplates, 1, 0, Benign, "instantiate templates while building a PCH") +LANGOPT(ModulesDeclUse , 1, 0, Compatible, "require declaration of module uses") +LANGOPT(ModulesSearchAll , 1, 1, Benign, "searching even non-imported modules to find unresolved references") +LANGOPT(ModulesStrictDeclUse, 1, 0, Compatible, "requiring declaration of module uses and all headers to be in modules") +LANGOPT(ModulesValidateTextualHeaderIncludes, 1, 1, Compatible, "validation of textual header includes") +LANGOPT(ModulesErrorRecovery, 1, 1, Benign, "automatically importing modules as needed when performing error recovery") +LANGOPT(ImplicitModules, 1, 1, Benign, "building modules that are not specified via -fmodule-file") +LANGOPT(ModulesLocalVisibility, 1, 0, Compatible, "local submodule visibility") +LANGOPT(Optimize , 1, 0, Compatible, "__OPTIMIZE__ predefined macro") +LANGOPT(OptimizeSize , 1, 0, Compatible, "__OPTIMIZE_SIZE__ predefined macro") +LANGOPT(Static , 1, 0, Compatible, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)") +VALUE_LANGOPT(PackStruct , 32, 0, NotCompatible, "default struct packing maximum alignment") -VALUE_LANGOPT(MaxTypeAlign , 32, 0, +VALUE_LANGOPT(MaxTypeAlign , 32, 0, NotCompatible, "default maximum alignment for types") -VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should be aligned to 8 bytes (x86 only)") -VALUE_LANGOPT(DoubleSize , 32, 0, "width of double") -VALUE_LANGOPT(LongDoubleSize , 32, 0, "width of long double") -LANGOPT(PPCIEEELongDouble , 1, 0, "use IEEE 754 quadruple-precision for long double") -LANGOPT(EnableAIXExtendedAltivecABI , 1, 0, "__EXTABI__ predefined macro") -LANGOPT(EnableAIXQuadwordAtomicsABI , 1, 0, "Use 16-byte atomic lock free semantics") -COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level") -COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie") -LANGOPT(ROPI , 1, 0, "Read-only position independence") -LANGOPT(RWPI , 1, 0, "Read-write position independence") -COMPATIBLE_LANGOPT(GNUInline , 1, 0, "GNU inline semantics") -COMPATIBLE_LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro") -COMPATIBLE_LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro") -COMPATIBLE_LANGOPT(FastMath , 1, 0, "fast FP math optimizations, and __FAST_MATH__ predefined macro") -COMPATIBLE_LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point Math") -COMPATIBLE_LANGOPT(ProtectParens , 1, 0, "optimizer honors parentheses " - "when floating-point expressions are evaluated") -BENIGN_LANGOPT(AllowFPReassoc , 1, 0, "Permit Floating Point reassociation") -BENIGN_LANGOPT(NoHonorNaNs , 1, 0, "Permit Floating Point optimization without regard to NaN") -BENIGN_LANGOPT(NoHonorInfs , 1, 0, "Permit Floating Point optimization without regard to infinities") -BENIGN_LANGOPT(NoSignedZero , 1, 0, "Permit Floating Point optimization without regard to signed zeros") -BENIGN_LANGOPT(AllowRecip , 1, 0, "Permit Floating Point reciprocal") -BENIGN_LANGOPT(ApproxFunc , 1, 0, "Permit Floating Point approximation") - -ENUM_LANGOPT(ComplexRange, ComplexRangeKind, 3, CX_None, "Enable use of range reduction for complex arithmetics.") - -BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars") - -BENIGN_LANGOPT(AccessControl , 1, 1, "C++ access control") -LANGOPT(CharIsSigned , 1, 1, "signed char") -LANGOPT(WCharSize , 4, 0, "width of wchar_t") -LANGOPT(WCharIsSigned , 1, 0, "signed or unsigned wchar_t") -ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, "member-pointer representation method") -ENUM_LANGOPT(DefaultCallingConv, DefaultCallingConvention, 3, DCC_None, "default calling convention") - -LANGOPT(ShortEnums , 1, 0, "short enum types") - -LANGOPT(OpenCL , 1, 0, "OpenCL") -LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version") -LANGOPT(OpenCLCPlusPlus , 1, 0, "C++ for OpenCL") -LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "C++ for OpenCL version") -LANGOPT(OpenCLGenericAddressSpace, 1, 0, "OpenCL generic keyword") -LANGOPT(OpenCLPipes , 1, 0, "OpenCL pipes language constructs and built-ins") -LANGOPT(NativeHalfType , 1, 0, "Native half type support") -LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns") -LANGOPT(CUDA , 1, 0, "CUDA") -LANGOPT(HIP , 1, 0, "HIP") -LANGOPT(OpenMP , 32, 0, "OpenMP support and version of OpenMP (31, 40 or 45)") -LANGOPT(OpenMPExtensions , 1, 1, "Enable all Clang extensions for OpenMP directives and clauses") -LANGOPT(OpenMPSimd , 1, 0, "Use SIMD only OpenMP support.") -LANGOPT(OpenMPUseTLS , 1, 0, "Use TLS for threadprivates or runtime calls") -LANGOPT(OpenMPIsTargetDevice , 1, 0, "Generate code only for OpenMP target device") -LANGOPT(OpenMPCUDAMode , 1, 0, "Generate code for OpenMP pragmas in SIMT/SPMD mode") -LANGOPT(OpenMPIRBuilder , 1, 0, "Use the experimental OpenMP-IR-Builder codegen path.") -LANGOPT(OpenMPCUDANumSMs , 32, 0, "Number of SMs for CUDA devices.") -LANGOPT(OpenMPCUDABlocksPerSM , 32, 0, "Number of blocks per SM for CUDA devices.") -LANGOPT(OpenMPCUDAReductionBufNum , 32, 1024, "Number of the reduction records in the intermediate reduction buffer used for the teams reductions.") -LANGOPT(OpenMPTargetDebug , 32, 0, "Enable debugging in the OpenMP offloading device RTL") -LANGOPT(OpenMPOptimisticCollapse , 1, 0, "Use at most 32 bits to represent the collapsed loop nest counter.") -LANGOPT(OpenMPThreadSubscription , 1, 0, "Assume work-shared loops do not have more iterations than participating threads.") -LANGOPT(OpenMPTeamSubscription , 1, 0, "Assume distributed loops do not have more iterations than participating teams.") -LANGOPT(OpenMPNoThreadState , 1, 0, "Assume that no thread in a parallel region will modify an ICV.") -LANGOPT(OpenMPNoNestedParallelism , 1, 0, "Assume that no thread in a parallel region will encounter a parallel region") -LANGOPT(OpenMPOffloadMandatory , 1, 0, "Assert that offloading is mandatory and do not create a host fallback.") -LANGOPT(OpenMPForceUSM , 1, 0, "Enable OpenMP unified shared memory mode via compiler.") -LANGOPT(NoGPULib , 1, 0, "Indicate a build without the standard GPU libraries.") - -LANGOPT(HLSL, 1, 0, "HLSL") -ENUM_LANGOPT(HLSLVersion, HLSLLangStd, 16, HLSL_Unset, "HLSL Version") -LANGOPT(HLSLStrictAvailability, 1, 0, +VALUE_LANGOPT(AlignDouble , 1, 0, NotCompatible, "Controls if doubles should be aligned to 8 bytes (x86 only)") +VALUE_LANGOPT(DoubleSize , 32, 0, NotCompatible, "width of double") +VALUE_LANGOPT(LongDoubleSize , 32, 0, NotCompatible, "width of long double") +LANGOPT(PPCIEEELongDouble , 1, 0, NotCompatible, "use IEEE 754 quadruple-precision for long double") +LANGOPT(EnableAIXExtendedAltivecABI , 1, 0, NotCompatible, "__EXTABI__ predefined macro") +LANGOPT(EnableAIXQuadwordAtomicsABI , 1, 0, NotCompatible, "Use 16-byte atomic lock free semantics") +VALUE_LANGOPT(PICLevel , 2, 0, Compatible, "__PIC__ level") +VALUE_LANGOPT(PIE , 1, 0, Compatible, "is pie") +LANGOPT(ROPI , 1, 0, NotCompatible, "Read-only position independence") +LANGOPT(RWPI , 1, 0, NotCompatible, "Read-write position independence") +LANGOPT(GNUInline , 1, 0, Compatible, "GNU inline semantics") +LANGOPT(NoInlineDefine , 1, 0, Compatible, "__NO_INLINE__ predefined macro") +LANGOPT(Deprecated , 1, 0, Compatible, "__DEPRECATED predefined macro") +LANGOPT(FastMath , 1, 0, Compatible, "fast FP math optimizations, and __FAST_MATH__ predefined macro") +LANGOPT(UnsafeFPMath , 1, 0, Compatible, "Unsafe Floating Point Math") +LANGOPT(ProtectParens , 1, 0, Compatible, "optimizer honors parentheses " + "when floating-point expressions are evaluated") +LANGOPT(AllowFPReassoc , 1, 0, Benign, "Permit Floating Point reassociation") +LANGOPT(NoHonorNaNs , 1, 0, Benign, "Permit Floating Point optimization without regard to NaN") +LANGOPT(NoHonorInfs , 1, 0, Benign, "Permit Floating Point optimization without regard to infinities") +LANGOPT(NoSignedZero , 1, 0, Benign, "Permit Floating Point optimization without regard to signed zeros") +LANGOPT(AllowRecip , 1, 0, Benign, "Permit Floating Point reciprocal") +LANGOPT(ApproxFunc , 1, 0, Benign, "Permit Floating Point approximation") + +ENUM_LANGOPT(ComplexRange, ComplexRangeKind, 3, CX_None, NotCompatible, "Enable use of range reduction for complex arithmetics.") + +LANGOPT(ObjCGCBitmapPrint , 1, 0, Benign, "printing of GC's bitmap layout for __weak/__strong ivars") + +LANGOPT(AccessControl , 1, 1, Benign, "C++ access control") +LANGOPT(CharIsSigned , 1, 1, NotCompatible, "signed char") +LANGOPT(WCharSize , 4, 0, NotCompatible, "width of wchar_t") +LANGOPT(WCharIsSigned , 1, 0, NotCompatible, "signed or unsigned wchar_t") +ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, NotCompatible, "member-pointer representation method") +ENUM_LANGOPT(DefaultCallingConv, DefaultCallingConvention, 3, DCC_None, NotCompatible, "default calling convention") + +LANGOPT(ShortEnums , 1, 0, NotCompatible, "short enum types") + +LANGOPT(OpenCL , 1, 0, NotCompatible, "OpenCL") +LANGOPT(OpenCLVersion , 32, 0, NotCompatible, "OpenCL C version") +LANGOPT(OpenCLCPlusPlus , 1, 0, NotCompatible, "C++ for OpenCL") +LANGOPT(OpenCLCPlusPlusVersion , 32, 0, NotCompatible, "C++ for OpenCL version") +LANGOPT(OpenCLGenericAddressSpace, 1, 0, NotCompatible, "OpenCL generic keyword") +LANGOPT(OpenCLPipes , 1, 0, NotCompatible, "OpenCL pipes language constructs and built-ins") +LANGOPT(NativeHalfType , 1, 0, NotCompatible, "Native half type support") +LANGOPT(NativeHalfArgsAndReturns, 1, 0, NotCompatible, "Native half args and returns") +LANGOPT(CUDA , 1, 0, NotCompatible, "CUDA") +LANGOPT(HIP , 1, 0, NotCompatible, "HIP") +LANGOPT(OpenMP , 32, 0, NotCompatible, "OpenMP support and version of OpenMP (31, 40 or 45)") +LANGOPT(OpenMPExtensions , 1, 1, NotCompatible, "Enable all Clang extensions for OpenMP directives and clauses") +LANGOPT(OpenMPSimd , 1, 0, NotCompatible, "Use SIMD only OpenMP support.") +LANGOPT(OpenMPUseTLS , 1, 0, NotCompatible, "Use TLS for threadprivates or runtime calls") +LANGOPT(OpenMPIsTargetDevice , 1, 0, NotCompatible, "Generate code only for OpenMP target device") +LANGOPT(OpenMPCUDAMode , 1, 0, NotCompatible, "Generate code for OpenMP pragmas in SIMT/SPMD mode") +LANGOPT(OpenMPIRBuilder , 1, 0, NotCompatible, "Use the experimental OpenMP-IR-Builder codegen path.") +LANGOPT(OpenMPCUDANumSMs , 32, 0, NotCompatible, "Number of SMs for CUDA devices.") +LANGOPT(OpenMPCUDABlocksPerSM , 32, 0, NotCompatible, "Number of blocks per SM for CUDA devices.") +LANGOPT(OpenMPCUDAReductionBufNum , 32, 1024, NotCompatible, "Number of the reduction records in the intermediate reduction buffer used for the teams reductions.") +LANGOPT(OpenMPTargetDebug , 32, 0, NotCompatible, "Enable debugging in the OpenMP offloading device RTL") +LANGOPT(OpenMPOptimisticCollapse , 1, 0, NotCompatible, "Use at most 32 bits to represent the collapsed loop nest counter.") +LANGOPT(OpenMPThreadSubscription , 1, 0, NotCompatible, "Assume work-shared loops do not have more iterations than participating threads.") +LANGOPT(OpenMPTeamSubscription , 1, 0, NotCompatible, "Assume distributed loops do not have more iterations than participating teams.") +LANGOPT(OpenMPNoThreadState , 1, 0, NotCompatible, "Assume that no thread in a parallel region will modify an ICV.") +LANGOPT(OpenMPNoNestedParallelism , 1, 0, NotCompatible, "Assume that no thread in a parallel region will encounter a parallel region") +LANGOPT(OpenMPOffloadMandatory , 1, 0, NotCompatible, "Assert that offloading is mandatory and do not create a host fallback.") +LANGOPT(OpenMPForceUSM , 1, 0, NotCompatible, "Enable OpenMP unified shared memory mode via compiler.") +LANGOPT(NoGPULib , 1, 0, NotCompatible, "Indicate a build without the standard GPU libraries.") + +LANGOPT(HLSL, 1, 0, NotCompatible, "HLSL") +ENUM_LANGOPT(HLSLVersion, HLSLLangStd, 16, HLSL_Unset, NotCompatible, "HLSL Version") +LANGOPT(HLSLStrictAvailability, 1, 0, NotCompatible, "Strict availability diagnostic mode for HLSL built-in functions.") -LANGOPT(CUDAIsDevice , 1, 0, "compiling for CUDA device") -LANGOPT(CUDAAllowVariadicFunctions, 1, 0, "allowing variadic functions in CUDA device code") -LANGOPT(CUDAHostDeviceConstexpr, 1, 1, "treating unattributed constexpr functions as __host__ __device__") -LANGOPT(GPUDeviceApproxTranscendentals, 1, 0, "using approximate transcendental functions") -LANGOPT(GPURelocatableDeviceCode, 1, 0, "generate relocatable device code") -LANGOPT(OffloadImplicitHostDeviceTemplates, 1, 0, "assume template functions to be implicitly host device by default for CUDA/HIP") -LANGOPT(GPUAllowDeviceInit, 1, 0, "allowing device side global init functions for HIP") -LANGOPT(GPUMaxThreadsPerBlock, 32, 1024, "default max threads per block for kernel launch bounds for HIP") -LANGOPT(GPUDeferDiag, 1, 0, "defer host/device related diagnostic messages for CUDA/HIP") -LANGOPT(GPUExcludeWrongSideOverloads, 1, 0, "always exclude wrong side overloads in overloading resolution for CUDA/HIP") -LANGOPT(OffloadingNewDriver, 1, 0, "use the new driver for generating offloading code.") -LANGOPT(OffloadViaLLVM, 1, 0, "target LLVM/Offload as portable offloading runtime.") - -LANGOPT(SYCLIsDevice , 1, 0, "Generate code for SYCL device") -LANGOPT(SYCLIsHost , 1, 0, "SYCL host compilation") -ENUM_LANGOPT(SYCLVersion , SYCLMajorVersion, 2, SYCL_None, "Version of the SYCL standard used") - -LANGOPT(HIPUseNewLaunchAPI, 1, 0, "Use new kernel launching API for HIP") -LANGOPT(OffloadUniformBlock, 1, 0, "Assume that kernels are launched with uniform block sizes (default true for CUDA/HIP and false otherwise)") -LANGOPT(HIPStdPar, 1, 0, "Enable Standard Parallel Algorithm Acceleration for HIP (experimental)") -LANGOPT(HIPStdParInterposeAlloc, 1, 0, "Replace allocations / deallocations with HIP RT calls when Standard Parallel Algorithm Acceleration for HIP is enabled (Experimental)") - -LANGOPT(OpenACC , 1, 0, "OpenACC Enabled") - -LANGOPT(MSVCEnableStdcMacro , 1, 0, "Define __STDC__ with '-fms-compatibility'") -LANGOPT(SizedDeallocation , 1, 0, "sized deallocation") -LANGOPT(AlignedAllocation , 1, 0, "aligned allocation") -LANGOPT(AlignedAllocationUnavailable, 1, 0, "aligned allocation functions are unavailable") -LANGOPT(NewAlignOverride , 32, 0, "maximum alignment guaranteed by '::operator new(size_t)'") -BENIGN_LANGOPT(ModulesCodegen , 1, 0, "Modules code generation") -BENIGN_LANGOPT(ModulesDebugInfo , 1, 0, "Modules debug info") -BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision") -BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records") -BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form") -BENIGN_LANGOPT(DumpRecordLayoutsCanonical , 1, 0, "dumping the AST layout of records using canonical field types") -BENIGN_LANGOPT(DumpRecordLayoutsComplete , 1, 0, "dumping the AST layout of all complete records") -BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "dumping the layouts of emitted vtables") -LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings") -BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden visibility for inline C++ methods") -BENIGN_ENUM_LANGOPT(DefaultVisibilityExportMapping, DefaultVisiblityExportMapping, 2, DefaultVisiblityExportMapping::None, "controls mapping of default visibility to dllexport") -BENIGN_LANGOPT(IgnoreXCOFFVisibility, 1, 0, "All the visibility attributes that are specified in the source code are ignored in aix XCOFF.") -BENIGN_LANGOPT(VisibilityInlinesHiddenStaticLocalVar, 1, 0, - "hidden visibility for static local variables in inline C++ " - "methods when -fvisibility-inlines hidden is enabled") -ENUM_LANGOPT(GlobalAllocationFunctionVisibility, VisibilityForcedKinds, 3, VisibilityForcedKinds::ForceDefault, +LANGOPT(CUDAIsDevice , 1, 0, NotCompatible, "compiling for CUDA device") +LANGOPT(CUDAAllowVariadicFunctions, 1, 0, NotCompatible, "allowing variadic functions in CUDA device code") +LANGOPT(CUDAHostDeviceConstexpr, 1, 1, NotCompatible, "treating unattributed constexpr functions as __host__ __device__") +LANGOPT(GPUDeviceApproxTranscendentals, 1, 0, NotCompatible, "using approximate transcendental functions") +LANGOPT(GPURelocatableDeviceCode, 1, 0, NotCompatible, "generate relocatable device code") +LANGOPT(OffloadImplicitHostDeviceTemplates, 1, 0, NotCompatible, "assume template functions to be implicitly host device by default for CUDA/HIP") +LANGOPT(GPUAllowDeviceInit, 1, 0, NotCompatible, "allowing device side global init functions for HIP") +LANGOPT(GPUMaxThreadsPerBlock, 32, 1024, NotCompatible, "default max threads per block for kernel launch bounds for HIP") +LANGOPT(GPUDeferDiag, 1, 0, NotCompatible, "defer host/device related diagnostic messages for CUDA/HIP") +LANGOPT(GPUExcludeWrongSideOverloads, 1, 0, NotCompatible, "always exclude wrong side overloads in overloading resolution for CUDA/HIP") +LANGOPT(OffloadingNewDriver, 1, 0, NotCompatible, "use the new driver for generating offloading code.") +LANGOPT(OffloadViaLLVM, 1, 0, NotCompatible, "target LLVM/Offload as portable offloading runtime.") + +LANGOPT(SYCLIsDevice , 1, 0, NotCompatible, "Generate code for SYCL device") +LANGOPT(SYCLIsHost , 1, 0, NotCompatible, "SYCL host compilation") +ENUM_LANGOPT(SYCLVersion , SYCLMajorVersion, 2, SYCL_None, NotCompatible, "Version of the SYCL standard used") + +LANGOPT(HIPUseNewLaunchAPI, 1, 0, NotCompatible, "Use new kernel launching API for HIP") +LANGOPT(OffloadUniformBlock, 1, 0, NotCompatible, "Assume that kernels are launched with uniform block sizes (default true for CUDA/HIP and false otherwise)") +LANGOPT(HIPStdPar, 1, 0, NotCompatible, "Enable Standard Parallel Algorithm Acceleration for HIP (experimental)") +LANGOPT(HIPStdParInterposeAlloc, 1, 0, NotCompatible, "Replace allocations / deallocations with HIP RT calls when Standard Parallel Algorithm Acceleration for HIP is enabled (Experimental)") + +LANGOPT(OpenACC , 1, 0, NotCompatible, "OpenACC Enabled") + +LANGOPT(MSVCEnableStdcMacro , 1, 0, NotCompatible, "Define __STDC__ with '-fms-compatibility'") +LANGOPT(SizedDeallocation , 1, 0, NotCompatible, "sized deallocation") +LANGOPT(AlignedAllocation , 1, 0, NotCompatible, "aligned allocation") +LANGOPT(AlignedAllocationUnavailable, 1, 0, NotCompatible, "aligned allocation functions are unavailable") +LANGOPT(NewAlignOverride , 32, 0, NotCompatible, "maximum alignment guaranteed by '::operator new(size_t)'") +LANGOPT(ModulesCodegen , 1, 0, Benign, "Modules code generation") +LANGOPT(ModulesDebugInfo , 1, 0, Benign, "Modules debug info") +LANGOPT(ElideConstructors , 1, 1, Benign, "C++ copy constructor elision") +LANGOPT(DumpRecordLayouts , 1, 0, Benign, "dumping the layout of IRgen'd records") +LANGOPT(DumpRecordLayoutsSimple , 1, 0, Benign, "dumping the layout of IRgen'd records in a simple form") +LANGOPT(DumpRecordLayoutsCanonical , 1, 0, Benign, "dumping the AST layout of records using canonical field types") +LANGOPT(DumpRecordLayoutsComplete , 1, 0, Benign, "dumping the AST layout of all complete records") +LANGOPT(DumpVTableLayouts , 1, 0, Benign, "dumping the layouts of emitted vtables") +LANGOPT(NoConstantCFStrings , 1, 0, NotCompatible, "no constant CoreFoundation strings") +LANGOPT(InlineVisibilityHidden , 1, 0, Benign, "hidden visibility for inline C++ methods") +ENUM_LANGOPT(DefaultVisibilityExportMapping, DefaultVisiblityExportMapping, 2, DefaultVisiblityExportMapping::None, Benign, "controls mapping of default visibility to dllexport") +LANGOPT(IgnoreXCOFFVisibility, 1, 0, Benign, "All the visibility attributes that are specified in the source code are ignored in aix XCOFF.") +LANGOPT(VisibilityInlinesHiddenStaticLocalVar, 1, 0, Benign, + "hidden visibility for static local variables in inline C++ " + "methods when -fvisibility-inlines hidden is enabled") +ENUM_LANGOPT(GlobalAllocationFunctionVisibility, VisibilityForcedKinds, 3, VisibilityForcedKinds::ForceDefault, NotCompatible, "How to apply visibility to global operator new and delete declarations") -LANGOPT(NewInfallible , 1, 0, "Treats throwing global C++ operator new as always returning valid memory (annotates with __attribute__((returns_nonnull)) and throw()). This is detectable in source.") -BENIGN_LANGOPT(ParseUnknownAnytype, 1, 0, "__unknown_anytype") -BENIGN_LANGOPT(DebuggerSupport , 1, 0, "debugger support") -BENIGN_LANGOPT(DebuggerCastResultToId, 1, 0, "for 'po' in the debugger, cast the result to id if it is of unknown type") -BENIGN_LANGOPT(DebuggerObjCLiteral , 1, 0, "debugger Objective-C literals and subscripting support") - -BENIGN_LANGOPT(SpellChecking , 1, 1, "spell-checking") -LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating point constants as single precision constants") -LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math") -BENIGN_LANGOPT(CLNoSignedZero , 1, 0, "Permit Floating Point optimization without regard to signed zeros") -COMPATIBLE_LANGOPT(CLUnsafeMath , 1, 0, "Unsafe Floating Point Math") +LANGOPT(NewInfallible , 1, 0, NotCompatible, "Treats throwing global C++ operator new as always returning valid memory (annotates with __attribute__((returns_nonnull)) and throw()). This is detectable in source.") +LANGOPT(ParseUnknownAnytype, 1, 0, Benign, "__unknown_anytype") +LANGOPT(DebuggerSupport , 1, 0, Benign, "debugger support") +LANGOPT(DebuggerCastResultToId, 1, 0, Benign, "for 'po' in the debugger, cast the result to id if it is of unknown type") +LANGOPT(DebuggerObjCLiteral , 1, 0, Benign, "debugger Objective-C literals and subscripting support") + +LANGOPT(SpellChecking , 1, 1, Benign, "spell-checking") +LANGOPT(SinglePrecisionConstants , 1, 0, NotCompatible, "treating double-precision floating point constants as single precision constants") +LANGOPT(FastRelaxedMath , 1, 0, NotCompatible, "OpenCL fast relaxed math") +LANGOPT(CLNoSignedZero , 1, 0, Benign, "Permit Floating Point optimization without regard to signed zeros") +LANGOPT(CLUnsafeMath , 1, 0, Compatible, "Unsafe Floating Point Math") /// FP_CONTRACT mode (on/off/fast). -BENIGN_ENUM_LANGOPT(DefaultFPContractMode, FPModeKind, 2, FPM_Off, "FP contraction type") -COMPATIBLE_LANGOPT(ExpStrictFP, 1, false, "Enable experimental strict floating point") -BENIGN_LANGOPT(RoundingMath, 1, false, "Do not assume default floating-point rounding behavior") -BENIGN_ENUM_LANGOPT(FPExceptionMode, FPExceptionModeKind, 2, FPE_Default, "FP Exception Behavior Mode type") -BENIGN_ENUM_LANGOPT(FPEvalMethod, FPEvalMethodKind, 2, FEM_UnsetOnCommandLine, "FP type used for floating point arithmetic") -ENUM_LANGOPT(Float16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, "Intermediate truncation behavior for Float16 arithmetic") -ENUM_LANGOPT(BFloat16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, "Intermediate truncation behavior for BFloat16 arithmetic") -LANGOPT(NoBitFieldTypeAlign , 1, 0, "bit-field type alignment") -LANGOPT(HexagonQdsp6Compat , 1, 0, "hexagon-qdsp6 backward compatibility") -LANGOPT(ObjCAutoRefCount , 1, 0, "Objective-C automated reference counting") -LANGOPT(ObjCWeakRuntime , 1, 0, "__weak support in the ARC runtime") -LANGOPT(ObjCWeak , 1, 0, "Objective-C __weak in ARC and MRC files") -LANGOPT(ObjCSubscriptingLegacyRuntime , 1, 0, "Subscripting support in legacy ObjectiveC runtime") -BENIGN_LANGOPT(CompatibilityQualifiedIdBlockParamTypeChecking, 1, 0, - "compatibility mode for type checking block parameters " - "involving qualified id types") -LANGOPT(ObjCDisableDirectMethodsForTesting, 1, 0, +ENUM_LANGOPT(DefaultFPContractMode, FPModeKind, 2, FPM_Off, Benign, "FP contraction type") +LANGOPT(ExpStrictFP, 1, false, Compatible, "Enable experimental strict floating point") +LANGOPT(RoundingMath, 1, false, Benign, "Do not assume default floating-point rounding behavior") +ENUM_LANGOPT(FPExceptionMode, FPExceptionModeKind, 2, FPE_Default, Benign, "FP Exception Behavior Mode type") +ENUM_LANGOPT(FPEvalMethod, FPEvalMethodKind, 2, FEM_UnsetOnCommandLine, Benign, "FP type used for floating point arithmetic") +ENUM_LANGOPT(Float16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, NotCompatible, "Intermediate truncation behavior for Float16 arithmetic") +ENUM_LANGOPT(BFloat16ExcessPrecision, ExcessPrecisionKind, 2, FPP_Standard, NotCompatible, "Intermediate truncation behavior for BFloat16 arithmetic") +LANGOPT(NoBitFieldTypeAlign , 1, 0, NotCompatible, "bit-field type alignment") +LANGOPT(HexagonQdsp6Compat , 1, 0, NotCompatible, "hexagon-qdsp6 backward compatibility") +LANGOPT(ObjCAutoRefCount , 1, 0, NotCompatible, "Objective-C automated reference counting") +LANGOPT(ObjCWeakRuntime , 1, 0, NotCompatible, "__weak support in the ARC runtime") +LANGOPT(ObjCWeak , 1, 0, NotCompatible, "Objective-C __weak in ARC and MRC files") +LANGOPT(ObjCSubscriptingLegacyRuntime , 1, 0, NotCompatible, "Subscripting support in legacy ObjectiveC runtime") +LANGOPT(CompatibilityQualifiedIdBlockParamTypeChecking, 1, 0, Benign, + "compatibility mode for type checking block parameters " + "involving qualified id types") +LANGOPT(ObjCDisableDirectMethodsForTesting, 1, 0, NotCompatible, "Disable recognition of objc_direct methods") -LANGOPT(CFProtectionBranch , 1, 0, "Control-Flow Branch Protection enabled") -ENUM_LANGOPT(CFBranchLabelScheme, CFBranchLabelSchemeKind, 2, CFBranchLabelSchemeKind::Default, +LANGOPT(CFProtectionBranch , 1, 0, NotCompatible, "Control-Flow Branch Protection enabled") +ENUM_LANGOPT(CFBranchLabelScheme, CFBranchLabelSchemeKind, 2, CFBranchLabelSchemeKind::Default, NotCompatible, "Control-Flow Branch Protection Label Scheme") -LANGOPT(CFProtectionReturn, 1, 0, "Control-Flow Return Protection enabled") -LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map") -ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode") -LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL") -LANGOPT(DeclareOpenCLBuiltins, 1, 0, "Declare OpenCL builtin functions") -BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing") -LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime") +LANGOPT(CFProtectionReturn, 1, 0, NotCompatible, "Control-Flow Return Protection enabled") +LANGOPT(FakeAddressSpaceMap , 1, 0, NotCompatible, "OpenCL fake address space map") +ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, NotCompatible, "OpenCL address space map mangling mode") +LANGOPT(IncludeDefaultHeader, 1, 0, NotCompatible, "Include default header file for OpenCL") +LANGOPT(DeclareOpenCLBuiltins, 1, 0, NotCompatible, "Declare OpenCL builtin functions") +LANGOPT(DelayedTemplateParsing , 1, 0, Benign, "delayed template parsing") +LANGOPT(BlocksRuntimeOptional , 1, 0, NotCompatible, "optional blocks runtime") LANGOPT( - CompleteMemberPointers, 1, 0, + CompleteMemberPointers, 1, 0, NotCompatible, "Require member pointer base types to be complete at the point where the " "type's inheritance model would be determined under the Microsoft ABI") -ENUM_LANGOPT(GC, GCMode, 2, NonGC, "Objective-C Garbage Collection mode") -BENIGN_ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility, +ENUM_LANGOPT(GC, GCMode, 2, NonGC, NotCompatible, "Objective-C Garbage Collection mode") +ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility, Benign, "default visibility for functions and variables [-fvisibility]") -BENIGN_ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility, +ENUM_LANGOPT(TypeVisibilityMode, Visibility, 3, DefaultVisibility, Benign, "default visibility for types [-ftype-visibility]") -LANGOPT(SetVisibilityForExternDecls, 1, 0, +LANGOPT(SetVisibilityForExternDecls, 1, 0, NotCompatible, "apply global symbol visibility to external declarations without an explicit visibility") -BENIGN_LANGOPT(VisibilityFromDLLStorageClass, 1, 0, - "override the visibility of globals based on their final DLL storage class [-fvisibility-from-dllstorageclass]") -BENIGN_ENUM_LANGOPT(DLLExportVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Default, +LANGOPT(VisibilityFromDLLStorageClass, 1, 0, Benign, + "override the visibility of globals based on their final DLL storage class [-fvisibility-from-dllstorageclass]") +ENUM_LANGOPT(DLLExportVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Default, Benign, "how to adjust the visibility for functions and variables with dllexport annotations [-fvisibility-dllexport]") -BENIGN_ENUM_LANGOPT(NoDLLStorageClassVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Hidden, +ENUM_LANGOPT(NoDLLStorageClassVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Hidden, Benign, "how to adjust the visibility for functions and variables without an explicit DLL storage class [-fvisibility-nodllstorageclass]") -BENIGN_ENUM_LANGOPT(ExternDeclDLLImportVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Default, +ENUM_LANGOPT(ExternDeclDLLImportVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Default, Benign, "how to adjust the visibility for external declarations with dllimport annotations [-fvisibility-externs-dllimport]") -BENIGN_ENUM_LANGOPT(ExternDeclNoDLLStorageClassVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Hidden, +ENUM_LANGOPT(ExternDeclNoDLLStorageClassVisibility, VisibilityFromDLLStorageClassKinds, 3, VisibilityFromDLLStorageClassKinds::Hidden, Benign, "how to adjust the visibility for external declarations without an explicit DLL storage class [-fvisibility-externs-nodllstorageclass]") -BENIGN_LANGOPT(SemanticInterposition , 1, 0, "semantic interposition") -BENIGN_LANGOPT(HalfNoSemanticInterposition, 1, 0, - "Like -fno-semantic-interposition but don't use local aliases") -ENUM_LANGOPT(StackProtector, StackProtectorMode, 2, SSPOff, +LANGOPT(SemanticInterposition , 1, 0, Benign, "semantic interposition") +LANGOPT(HalfNoSemanticInterposition, 1, 0, Benign, + "Like -fno-semantic-interposition but don't use local aliases") +ENUM_LANGOPT(StackProtector, StackProtectorMode, 2, SSPOff, NotCompatible, "stack protector mode") -BENIGN_ENUM_LANGOPT(TrivialAutoVarInit, TrivialAutoVarInitKind, 2, TrivialAutoVarInitKind::Uninitialized, +ENUM_LANGOPT(TrivialAutoVarInit, TrivialAutoVarInitKind, 2, TrivialAutoVarInitKind::Uninitialized, Benign, "trivial automatic variable initialization") -BENIGN_VALUE_LANGOPT(TrivialAutoVarInitStopAfter, 32, 0, - "stop trivial automatic variable initialization after the specified number of instances. Must be greater than 0.") -BENIGN_VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, - "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") -ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, +VALUE_LANGOPT(TrivialAutoVarInitStopAfter, 32, 0, Benign, + "stop trivial automatic variable initialization after the specified number of instances. Must be greater than 0.") +VALUE_LANGOPT(TrivialAutoVarInitMaxSize, 32, 0, Benign, + "stop trivial automatic variable initialization if var size exceeds the specified size (in bytes). Must be greater than 0.") +ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, NotCompatible, "signed integer overflow handling") -LANGOPT(PointerOverflowDefined, 1, 0, "make pointer overflow defined") -ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, "Thread Model") - -BENIGN_LANGOPT(ArrowDepth, 32, 256, - "maximum number of operator->s to follow") -BENIGN_LANGOPT(InstantiationDepth, 32, 1024, - "maximum template instantiation depth") -BENIGN_LANGOPT(ConstexprCallDepth, 32, 512, - "maximum constexpr call depth") -BENIGN_LANGOPT(ConstexprStepLimit, 32, 1048576, - "maximum constexpr evaluation steps") -BENIGN_LANGOPT(EnableNewConstInterp, 1, 0, - "enable the experimental new constant interpreter") -BENIGN_LANGOPT(BracketDepth, 32, 256, - "maximum bracket nesting depth") -BENIGN_LANGOPT(NumLargeByValueCopy, 32, 0, +LANGOPT(PointerOverflowDefined, 1, 0, NotCompatible, "make pointer overflow defined") +ENUM_LANGOPT(ThreadModel , ThreadModelKind, 2, ThreadModelKind::POSIX, NotCompatible, "Thread Model") + +LANGOPT(ArrowDepth, 32, 256, Benign, + "maximum number of operator->s to follow") +LANGOPT(InstantiationDepth, 32, 1024, Benign, + "maximum template instantiation depth") +LANGOPT(ConstexprCallDepth, 32, 512, Benign, + "maximum constexpr call depth") +LANGOPT(ConstexprStepLimit, 32, 1048576, Benign, + "maximum constexpr evaluation steps") +LANGOPT(EnableNewConstInterp, 1, 0, Benign, + "enable the experimental new constant interpreter") +LANGOPT(BracketDepth, 32, 256, Benign, + "maximum bracket nesting depth") +LANGOPT(NumLargeByValueCopy, 32, 0, Benign, "if non-zero, warn about parameter or return Warn if parameter/return value is larger in bytes than this setting. 0 is no check.") -VALUE_LANGOPT(MSCompatibilityVersion, 32, 0, "Microsoft Visual C/C++ Version") -ENUM_LANGOPT(VtorDispMode, MSVtorDispMode, 2, MSVtorDispMode::ForVBaseOverride, +VALUE_LANGOPT(MSCompatibilityVersion, 32, 0, NotCompatible, "Microsoft Visual C/C++ Version") +ENUM_LANGOPT(VtorDispMode, MSVtorDispMode, 2, MSVtorDispMode::ForVBaseOverride, NotCompatible, "How many vtordisps to insert") -LANGOPT(ApplePragmaPack, 1, 0, "Apple gcc-compatible #pragma pack handling") +LANGOPT(ApplePragmaPack, 1, 0, NotCompatible, "Apple gcc-compatible #pragma pack handling") -LANGOPT(XLPragmaPack, 1, 0, "IBM XL #pragma pack handling") +LANGOPT(XLPragmaPack, 1, 0, NotCompatible, "IBM XL #pragma pack handling") -COMPATIBLE_LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, "retain documentation comments from system headers in the AST") +LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, Compatible, "retain documentation comments from system headers in the AST") -LANGOPT(APINotes, 1, 0, "use external API notes") -LANGOPT(APINotesModules, 1, 0, "use module-based external API notes") +LANGOPT(APINotes, 1, 0, NotCompatible, "use external API notes") +LANGOPT(APINotesModules, 1, 0, NotCompatible, "use module-based external API notes") -LANGOPT(SanitizeAddressFieldPadding, 2, 0, "controls how aggressive is ASan " - "field padding (0: none, 1:least " - "aggressive, 2: more aggressive)") +LANGOPT(SanitizeAddressFieldPadding, 2, 0, NotCompatible, "controls how aggressive is ASan " + "field padding (0: none, 1:least " + "aggressive, 2: more aggressive)") -LANGOPT(Cmse, 1, 0, "ARM Security extensions support") +LANGOPT(Cmse, 1, 0, NotCompatible, "ARM Security extensions support") -LANGOPT(XRayInstrument, 1, 0, "controls whether to do XRay instrumentation") -LANGOPT(XRayAlwaysEmitCustomEvents, 1, 0, +LANGOPT(XRayInstrument, 1, 0, NotCompatible, "controls whether to do XRay instrumentation") +LANGOPT(XRayAlwaysEmitCustomEvents, 1, 0, NotCompatible, "controls whether to always emit intrinsic calls to " "__xray_customevent(...) builtin.") -LANGOPT(XRayAlwaysEmitTypedEvents, 1, 0, +LANGOPT(XRayAlwaysEmitTypedEvents, 1, 0, NotCompatible, "controls whether to always emit intrinsic calls to " "__xray_typedevent(...) builtin.") -LANGOPT(ForceEmitVTables, 1, 0, "whether to emit all vtables") +LANGOPT(ForceEmitVTables, 1, 0, NotCompatible, "whether to emit all vtables") -BENIGN_LANGOPT(AllowEditorPlaceholders, 1, 0, - "allow editor placeholders in source") +LANGOPT(AllowEditorPlaceholders, 1, 0, Benign, + "allow editor placeholders in source") -ENUM_LANGOPT(ClangABICompat, ClangABI, 4, ClangABI::Latest, +ENUM_LANGOPT(ClangABICompat, ClangABI, 4, ClangABI::Latest, NotCompatible, "version of Clang that we should attempt to be ABI-compatible " "with") -COMPATIBLE_VALUE_LANGOPT(FunctionAlignment, 5, 0, "Default alignment for functions") -COMPATIBLE_VALUE_LANGOPT(LoopAlignment, 32, 0, "Default alignment for loops") +VALUE_LANGOPT(FunctionAlignment, 5, 0, Compatible, "Default alignment for functions") +VALUE_LANGOPT(LoopAlignment, 32, 0, Compatible, "Default alignment for loops") -LANGOPT(FixedPoint, 1, 0, "fixed point types") -LANGOPT(PaddingOnUnsignedFixedPoint, 1, 0, +LANGOPT(FixedPoint, 1, 0, NotCompatible, "fixed point types") +LANGOPT(PaddingOnUnsignedFixedPoint, 1, 0, NotCompatible, "unsigned fixed point types having one extra padding bit") ENUM_LANGOPT(RegisterStaticDestructors, RegisterStaticDestructorsKind, 2, - RegisterStaticDestructorsKind::All, + RegisterStaticDestructorsKind::All, NotCompatible, "Register C++ static destructors") -LANGOPT(RegCall4, 1, 0, "Set __regcall4 as a default calling convention to respect __regcall ABI v.4") +LANGOPT(RegCall4, 1, 0, NotCompatible, "Set __regcall4 as a default calling convention to respect __regcall ABI v.4") -LANGOPT(MatrixTypes, 1, 0, "Enable or disable the builtin matrix type") +LANGOPT(MatrixTypes, 1, 0, NotCompatible, "Enable or disable the builtin matrix type") -LANGOPT(CXXAssumptions, 1, 1, "Enable or disable codegen and compile-time checks for C++23's [[assume]] attribute") +LANGOPT(CXXAssumptions, 1, 1, NotCompatible, "Enable or disable codegen and compile-time checks for C++23's [[assume]] attribute") -LANGOPT(RawStringLiterals, 1, 1, "Enable or disable raw string literals") +LANGOPT(RawStringLiterals, 1, 1, NotCompatible, "Enable or disable raw string literals") ENUM_LANGOPT(StrictFlexArraysLevel, StrictFlexArraysLevelKind, 2, - StrictFlexArraysLevelKind::Default, + StrictFlexArraysLevelKind::Default, NotCompatible, "Rely on strict definition of flexible arrays") -COMPATIBLE_VALUE_LANGOPT(MaxTokens, 32, 0, "Max number of tokens per TU or 0") +VALUE_LANGOPT(MaxTokens, 32, 0, Compatible, "Max number of tokens per TU or 0") -ENUM_LANGOPT(SignReturnAddressScope, SignReturnAddressScopeKind, 2, SignReturnAddressScopeKind::None, +ENUM_LANGOPT(SignReturnAddressScope, SignReturnAddressScopeKind, 2, SignReturnAddressScopeKind::None, NotCompatible, "Scope of return address signing") -ENUM_LANGOPT(SignReturnAddressKey, SignReturnAddressKeyKind, 1, SignReturnAddressKeyKind::AKey, +ENUM_LANGOPT(SignReturnAddressKey, SignReturnAddressKeyKind, 1, SignReturnAddressKeyKind::AKey, NotCompatible, "Key used for return address signing") -LANGOPT(BranchTargetEnforcement, 1, 0, "Branch-target enforcement enabled") -LANGOPT(BranchProtectionPAuthLR, 1, 0, "Use PC as a diversifier using PAuthLR NOP instructions.") -LANGOPT(GuardedControlStack, 1, 0, "Guarded control stack enabled") +LANGOPT(BranchTargetEnforcement, 1, 0, NotCompatible, "Branch-target enforcement enabled") +LANGOPT(BranchProtectionPAuthLR, 1, 0, NotCompatible, "Use PC as a diversifier using PAuthLR NOP instructions.") +LANGOPT(GuardedControlStack, 1, 0, NotCompatible, "Guarded control stack enabled") -LANGOPT(SpeculativeLoadHardening, 1, 0, "Speculative load hardening enabled") +LANGOPT(SpeculativeLoadHardening, 1, 0, NotCompatible, "Speculative load hardening enabled") -LANGOPT(RelativeCXXABIVTables, 1, 0, +LANGOPT(RelativeCXXABIVTables, 1, 0, NotCompatible, "Use an ABI-incompatible v-table layout that uses relative references") -LANGOPT(OmitVTableRTTI, 1, 0, +LANGOPT(OmitVTableRTTI, 1, 0, NotCompatible, "Use an ABI-incompatible v-table layout that omits the RTTI component") -LANGOPT(VScaleMin, 32, 0, "Minimum vscale value") -LANGOPT(VScaleMax, 32, 0, "Maximum vscale value") +LANGOPT(VScaleMin, 32, 0, NotCompatible, "Minimum vscale value") +LANGOPT(VScaleMax, 32, 0, NotCompatible, "Maximum vscale value") -LANGOPT(VScaleStreamingMin, 32, 0, "Minimum streaming vscale value") -LANGOPT(VScaleStreamingMax, 32, 0, "Maximum streaming vscale value") +LANGOPT(VScaleStreamingMin, 32, 0, NotCompatible, "Minimum streaming vscale value") +LANGOPT(VScaleStreamingMax, 32, 0, NotCompatible, "Maximum streaming vscale value") -ENUM_LANGOPT(ExtendIntArgs, ExtendArgsKind, 1, ExtendArgsKind::ExtendTo32, +ENUM_LANGOPT(ExtendIntArgs, ExtendArgsKind, 1, ExtendArgsKind::ExtendTo32, NotCompatible, "Controls how scalar integer arguments are extended in calls " "to unprototyped and varargs functions") -VALUE_LANGOPT(FuchsiaAPILevel, 32, 0, "Fuchsia API level") +VALUE_LANGOPT(FuchsiaAPILevel, 32, 0, NotCompatible, "Fuchsia API level") // This option will be removed in the future once the backend // supports all operations (like division or float-to-integer conversion) // on large _BitInts. -BENIGN_VALUE_LANGOPT(MaxBitIntWidth, 32, 128, "Maximum width of a _BitInt") +VALUE_LANGOPT(MaxBitIntWidth, 32, 128, Benign, "Maximum width of a _BitInt") -COMPATIBLE_LANGOPT(IncrementalExtensions, 1, 0, "True if we want to process statements " +LANGOPT(IncrementalExtensions, 1, 0, Compatible, "True if we want to process statements " "on the global scope, ignore EOF token and continue later on (thus " "avoid tearing the Lexer and etc. down). Controlled by " "-fincremental-extensions.") -BENIGN_LANGOPT(CheckNew, 1, 0, "Do not assume C++ operator new may not return NULL") +LANGOPT(CheckNew, 1, 0, Benign, "Do not assume C++ operator new may not return NULL") // FIXME: It would be better for us to find a way to encode the state of this // diagnostic in tablegen so that we can specify a particular diagnostic option // is disabled or enabled based on other language options or made it easier to // do this from the compiler invocation without hitting option round-tripping // issues. -BENIGN_LANGOPT(CheckConstexprFunctionBodies, 1, 1, - "Emit diagnostics for a constexpr function body that can never " - "be used in a constant expression.") +LANGOPT(CheckConstexprFunctionBodies, 1, 1, Benign, + "Emit diagnostics for a constexpr function body that can never " + "be used in a constant expression.") -LANGOPT(BoundsSafety, 1, 0, "Bounds safety extension for C") +LANGOPT(BoundsSafety, 1, 0, NotCompatible, "Bounds safety extension for C") -LANGOPT(PreserveVec3Type, 1, 0, "Preserve 3-component vector type") +LANGOPT(PreserveVec3Type, 1, 0, NotCompatible, "Preserve 3-component vector type") #undef LANGOPT -#undef COMPATIBLE_LANGOPT -#undef BENIGN_LANGOPT #undef ENUM_LANGOPT -#undef COMPATIBLE_ENUM_LANGOPT -#undef BENIGN_ENUM_LANGOPT #undef VALUE_LANGOPT -#undef COMPATIBLE_VALUE_LANGOPT -#undef BENIGN_VALUE_LANGOPT diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index b7c5ed994c992..4c642c9e10c91 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -77,6 +77,22 @@ class LangOptionsBase { using RoundingMode = llvm::RoundingMode; using CFBranchLabelSchemeKind = clang::CFBranchLabelSchemeKind; + /// For ASTs produced with different option value, signifies their level of + /// compatibility. + enum class CompatibilityKind { + /// Does affect the construction of the AST in a way that does prevent + /// module interoperability. + NotCompatible, + /// Does affect the construction of the AST in a way that doesn't prevent + /// interoperability (that is, the value can be different between an + /// explicit module and the user of that module). + Compatible, + /// Does not affect the construction of the AST in any way (that is, the + /// value can be different between an implicit module and the user of that + /// module). + Benign, + }; + enum GCMode { NonGC, GCOnly, HybridGC }; enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq }; @@ -486,16 +502,17 @@ class LangOptionsBase { }; // Define simple language options (with no accessors). -#define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits; -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ + unsigned Name : Bits; +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) #include "clang/Basic/LangOptions.def" protected: // Define language options of enumeration type. These are private, and will // have accessors (below). -#define LANGOPT(Name, Bits, Default, Description) -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - LLVM_PREFERRED_TYPE(Type) \ +#define LANGOPT(Name, Bits, Default, Compatibility, Description) +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + LLVM_PREFERRED_TYPE(Type) \ unsigned Name : Bits; #include "clang/Basic/LangOptions.def" }; @@ -655,8 +672,8 @@ class LangOptions : public LangOptionsBase { LangStandard::Kind LangStd = LangStandard::lang_unspecified); // Define accessors/mutators for language options of enumeration type. -#define LANGOPT(Name, Bits, Default, Description) -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ +#define LANGOPT(Name, Bits, Default, Compatibility, Description) +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ Type get##Name() const { return static_cast(Name); } \ void set##Name(Type Value) { \ assert(static_cast(Value) < (1u << Bits)); \ diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 912b890569cf5..9c14a25699f89 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -16,16 +16,19 @@ using namespace clang; LangOptions::LangOptions() : LangStd(LangStandard::lang_unspecified) { -#define LANGOPT(Name, Bits, Default, Description) Name = Default; -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) set##Name(Default); +#define LANGOPT(Name, Bits, Default, Compatibility, Description) Name = Default; +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + set##Name(Default); #include "clang/Basic/LangOptions.def" } void LangOptions::resetNonModularOptions() { -#define LANGOPT(Name, Bits, Default, Description) -#define BENIGN_LANGOPT(Name, Bits, Default, Description) Name = Default; -#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - Name = static_cast(Default); +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CompatibilityKind::Compatibility == CompatibilityKind::Benign) \ + Name = Default; +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + if constexpr (CompatibilityKind::Compatibility == CompatibilityKind::Benign) \ + Name = static_cast(Default); #include "clang/Basic/LangOptions.def" // Reset "benign" options with implied values (Options.td ImpliedBy relations) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 6633e4a7787ee..e233821fa5d2a 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -5222,11 +5222,14 @@ std::string CompilerInvocation::getModuleHash() const { HBuilder.add(serialization::VERSION_MAJOR, serialization::VERSION_MINOR); // Extend the signature with the language options -#define LANGOPT(Name, Bits, Default, Description) HBuilder.add(LangOpts->Name); -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - HBuilder.add(static_cast(LangOpts->get##Name())); -#define BENIGN_LANGOPT(Name, Bits, Default, Description) -#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) + // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`. + using CK = LangOptions::CompatibilityKind; +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) \ + HBuilder.add(LangOpts->Name); +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) \ + HBuilder.add(static_cast(LangOpts->get##Name())); #include "clang/Basic/LangOptions.def" HBuilder.addRange(getLangOpts().ModuleFeatures); diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index c0ab708d8b844..89eb0b689f85c 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -643,16 +643,20 @@ namespace { bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override { + // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`. + using CK = LangOptions::CompatibilityKind; + Out.indent(2) << "Language options:\n"; -#define LANGOPT(Name, Bits, Default, Description) \ +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) \ DUMP_BOOLEAN(LangOpts.Name, Description); -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - Out.indent(4) << Description << ": " \ +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) \ + Out.indent(4) << Description << ": " \ << static_cast(LangOpts.get##Name()) << "\n"; -#define VALUE_LANGOPT(Name, Bits, Default, Description) \ +#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) \ Out.indent(4) << Description << ": " << LangOpts.Name << "\n"; -#define BENIGN_LANGOPT(Name, Bits, Default, Description) -#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) #include "clang/Basic/LangOptions.def" if (!LangOpts.ModuleFeatures.empty()) { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index cc2d2ea86ccb7..30e0973149594 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -278,51 +278,57 @@ static bool checkLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences = true) { -#define LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) { \ - if (Bits == 1) \ - Diags->Report(diag::err_ast_file_langopt_mismatch) \ - << Description << LangOpts.Name << ExistingLangOpts.Name \ - << ModuleFilename; \ - else \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ + // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`. + using CK = LangOptions::CompatibilityKind; + +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) { \ + if ((CK::Compatibility == CK::NotCompatible) || \ + (CK::Compatibility == CK::Compatible && \ + !AllowCompatibleDifferences)) { \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) { \ + if (Bits == 1) \ + Diags->Report(diag::err_ast_file_langopt_mismatch) \ + << Description << LangOpts.Name << ExistingLangOpts.Name \ + << ModuleFilename; \ + else \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << ModuleFilename; \ + } \ + return true; \ + } \ } \ - return true; \ } -#define VALUE_LANGOPT(Name, Bits, Default, Description) \ - if (ExistingLangOpts.Name != LangOpts.Name) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ - return true; \ +#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) { \ + if ((CK::Compatibility == CK::NotCompatible) || \ + (CK::Compatibility == CK::Compatible && \ + !AllowCompatibleDifferences)) { \ + if (ExistingLangOpts.Name != LangOpts.Name) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << ModuleFilename; \ + return true; \ + } \ + } \ } -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ - if (Diags) \ - Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ - << Description << ModuleFilename; \ - return true; \ +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ + if constexpr (CK::Compatibility != CK::Benign) { \ + if ((CK::Compatibility == CK::NotCompatible) || \ + (CK::Compatibility == CK::Compatible && \ + !AllowCompatibleDifferences)) { \ + if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ + if (Diags) \ + Diags->Report(diag::err_ast_file_langopt_value_mismatch) \ + << Description << ModuleFilename; \ + return true; \ + } \ + } \ } -#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ - if (!AllowCompatibleDifferences) \ - LANGOPT(Name, Bits, Default, Description) - -#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ - if (!AllowCompatibleDifferences) \ - ENUM_LANGOPT(Name, Bits, Default, Description) - -#define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ - if (!AllowCompatibleDifferences) \ - VALUE_LANGOPT(Name, Bits, Default, Description) - -#define BENIGN_LANGOPT(Name, Bits, Default, Description) -#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) -#define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description) #include "clang/Basic/LangOptions.def" if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { @@ -6353,9 +6359,9 @@ bool ASTReader::ParseLanguageOptions(const RecordData &Record, bool AllowCompatibleDifferences) { LangOptions LangOpts; unsigned Idx = 0; -#define LANGOPT(Name, Bits, Default, Description) \ +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ LangOpts.Name = Record[Idx++]; -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ LangOpts.set##Name(static_cast(Record[Idx++])); #include "clang/Basic/LangOptions.def" #define SANITIZER(NAME, ID) \ diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 5086f8f5be63b..1a20fc9595dce 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1612,9 +1612,9 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) { // Language options. Record.clear(); const LangOptions &LangOpts = PP.getLangOpts(); -#define LANGOPT(Name, Bits, Default, Description) \ +#define LANGOPT(Name, Bits, Default, Compatibility, Description) \ Record.push_back(LangOpts.Name); -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ +#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \ Record.push_back(static_cast(LangOpts.get##Name())); #include "clang/Basic/LangOptions.def" #define SANITIZER(NAME, ID) \