On Thu, Dec 7, 2017 at 2:56 PM, Richard Smith via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Looks like this might have messed up the line endings in a few files?
Should be taken care of in r320112. -Ahmed > On 7 December 2017 at 13:46, Aaron Ballman via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> Author: aaronballman >> Date: Thu Dec 7 13:46:26 2017 >> New Revision: 320089 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=320089&view=rev >> Log: >> Add new language mode flags for C17. >> >> This adds -std=c17, -std=gnu17, and -std=iso9899:2017 as language mode >> flags for C17 and updates the value of __STDC_VERSION__ to the value based >> on the C17 FDIS. Given that this ballot cannot succeed until 2018, it is >> expected that we (and GCC) will add c18 flags as aliases once the ballot >> passes. >> >> Modified: >> cfe/trunk/docs/ReleaseNotes.rst >> cfe/trunk/include/clang/Basic/LangOptions.def >> cfe/trunk/include/clang/Frontend/LangStandard.h >> cfe/trunk/include/clang/Frontend/LangStandards.def >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> cfe/trunk/test/Driver/unknown-std.c >> >> Modified: cfe/trunk/docs/ReleaseNotes.rst >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/docs/ReleaseNotes.rst (original) >> +++ cfe/trunk/docs/ReleaseNotes.rst Thu Dec 7 13:46:26 2017 >> @@ -121,6 +121,12 @@ New Compiler Flags >> number of attributes are supported outside of C++ mode. See the Clang >> attribute documentation for more information about which attributes are >> supported for each syntax. >> + >> +- Added the ``-std=c17``, ``-std=gnu17``, and ``-std=iso9899:2017`` >> language >> + mode flags for compatibility with GCC. This enables support for the >> next >> + version of the C standard, expected to be published by ISO in 2018. The >> only >> + difference between the ``-std=c17`` and ``-std=c11`` language modes is >> the >> + value of the ``__STDC_VERSION__`` macro, as C17 is a bug fix release. >> >> Deprecated Compiler Flags >> ------------------------- >> >> Modified: cfe/trunk/include/clang/Basic/LangOptions.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/LangOptions.def (original) >> +++ cfe/trunk/include/clang/Basic/LangOptions.def Thu Dec 7 13:46:26 2017 >> @@ -1,187 +1,188 @@ >> -//===--- LangOptions.def - Language option database -------------*- C++ >> -*-===// >> -// >> -// The LLVM Compiler Infrastructure >> -// >> -// This file is distributed under the University of Illinois Open Source >> -// License. See LICENSE.TXT for details. >> -// >> >> -//===----------------------------------------------------------------------===// >> -// >> -// This file defines the language options. Users of this file must >> -// define the LANGOPT macro to make use of this information. >> -// >> -// 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". >> >> -//===----------------------------------------------------------------------===// >> - >> -#ifndef LANGOPT >> -# 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) >> -#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) >> -#endif >> - >> -// FIXME: A lot of the BENIGN_ options should be COMPATIBLE_ instead. >> -LANGOPT(C99 , 1, 0, "C99") >> -LANGOPT(C11 , 1, 0, "C11") >> -LANGOPT(MSVCCompat , 1, 0, "Microsoft Visual C++ full >> compatibility mode") >> -LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ 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(CPlusPlus2a , 1, 0, "C++2a") >> -LANGOPT(ObjC1 , 1, 0, "Objective-C 1") >> -LANGOPT(ObjC2 , 1, 0, "Objective-C 2") >> -BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, >> - "Objective-C auto-synthesized properties") >> -BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0, >> - "Encoding extended block type signature") >> -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, CPlusPlus, "wchar_t 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") >> -BENIGN_LANGOPT(ImplicitInt, 1, !C99 && !CPlusPlus, "C89 implicit 'int'") >> -LANGOPT(Digraphs , 1, 0, "digraphs") >> -BENIGN_LANGOPT(HexFloats , 1, C99, "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") >> -LANGOPT(LaxVectorConversions , 1, 1, "lax vector conversions") >> -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(DWARFExceptions , 1, 0, "dwarf exception handling") >> -LANGOPT(SjLjExceptions , 1, 0, "setjmp-longjump exception handling") >> -LANGOPT(SEHExceptions , 1, 0, "SEH .xdata exception handling") >> -LANGOPT(ExternCNoUnwind , 1, 0, "Assume extern C functions don't >> unwind") >> -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(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(CoroutinesTS , 1, 0, "C++ coroutines TS") >> -LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of >> template template arguments") >> - >> -LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension >> for all language standard modes") >> - >> -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") >> -BENIGN_LANGOPT(HeinousExtensions , 1, 0, "extensions that we really don't >> like and may be ripped out at any time") >> -LANGOPT(Modules , 1, 0, "modules extension to C") >> -COMPATIBLE_LANGOPT(ModulesTS , 1, 0, "C++ Modules TS") >> -BENIGN_ENUM_LANGOPT(CompilingModule, CompilingModuleKind, 2, CMK_None, >> - "compiling a module interface") >> -BENIGN_LANGOPT(CompilingPCH, 1, 0, "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") >> -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, >> - "default struct packing maximum alignment") >> -VALUE_LANGOPT(MaxTypeAlign , 32, 0, >> - "default maximum alignment for types") >> -VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should >> be aligned to 8 bytes (x86 only)") >> -COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level") >> -COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie") >> -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(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ >> predefined macro") >> -COMPATIBLE_LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point >> Math") >> - >> -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") >> +//===--- LangOptions.def - Language option database -------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> >> +//===----------------------------------------------------------------------===// >> +// >> +// This file defines the language options. Users of this file must >> +// define the LANGOPT macro to make use of this information. >> +// >> +// 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". >> >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LANGOPT >> +# 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) >> +#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) >> +#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(MSVCCompat , 1, 0, "Microsoft Visual C++ full >> compatibility mode") >> +LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ 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(CPlusPlus2a , 1, 0, "C++2a") >> +LANGOPT(ObjC1 , 1, 0, "Objective-C 1") >> +LANGOPT(ObjC2 , 1, 0, "Objective-C 2") >> +BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, >> + "Objective-C auto-synthesized properties") >> +BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0, >> + "Encoding extended block type signature") >> +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, CPlusPlus, "wchar_t 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") >> +BENIGN_LANGOPT(ImplicitInt, 1, !C99 && !CPlusPlus, "C89 implicit 'int'") >> +LANGOPT(Digraphs , 1, 0, "digraphs") >> +BENIGN_LANGOPT(HexFloats , 1, C99, "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") >> +LANGOPT(LaxVectorConversions , 1, 1, "lax vector conversions") >> +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(DWARFExceptions , 1, 0, "dwarf exception handling") >> +LANGOPT(SjLjExceptions , 1, 0, "setjmp-longjump exception handling") >> +LANGOPT(SEHExceptions , 1, 0, "SEH .xdata exception handling") >> +LANGOPT(ExternCNoUnwind , 1, 0, "Assume extern C functions don't >> unwind") >> +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(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(CoroutinesTS , 1, 0, "C++ coroutines TS") >> +LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of >> template template arguments") >> + >> +LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension >> for all language standard modes") >> + >> +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") >> +BENIGN_LANGOPT(HeinousExtensions , 1, 0, "extensions that we really don't >> like and may be ripped out at any time") >> +LANGOPT(Modules , 1, 0, "modules extension to C") >> +COMPATIBLE_LANGOPT(ModulesTS , 1, 0, "C++ Modules TS") >> +BENIGN_ENUM_LANGOPT(CompilingModule, CompilingModuleKind, 2, CMK_None, >> + "compiling a module interface") >> +BENIGN_LANGOPT(CompilingPCH, 1, 0, "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") >> +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, >> + "default struct packing maximum alignment") >> +VALUE_LANGOPT(MaxTypeAlign , 32, 0, >> + "default maximum alignment for types") >> +VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should >> be aligned to 8 bytes (x86 only)") >> +COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level") >> +COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie") >> +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(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ >> predefined macro") >> +COMPATIBLE_LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point >> Math") >> + >> +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") >> >> Modified: cfe/trunk/include/clang/Frontend/LangStandard.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/LangStandard.h?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Frontend/LangStandard.h (original) >> +++ cfe/trunk/include/clang/Frontend/LangStandard.h Thu Dec 7 13:46:26 >> 2017 >> @@ -1,110 +1,114 @@ >> -//===--- LangStandard.h -----------------------------------------*- C++ >> -*-===// >> -// >> -// The LLVM Compiler Infrastructure >> -// >> -// This file is distributed under the University of Illinois Open Source >> -// License. See LICENSE.TXT for details. >> -// >> >> -//===----------------------------------------------------------------------===// >> - >> -#ifndef LLVM_CLANG_FRONTEND_LANGSTANDARD_H >> -#define LLVM_CLANG_FRONTEND_LANGSTANDARD_H >> - >> -#include "clang/Basic/LLVM.h" >> -#include "clang/Frontend/FrontendOptions.h" >> -#include "llvm/ADT/StringRef.h" >> - >> -namespace clang { >> - >> -namespace frontend { >> - >> -enum LangFeatures { >> - LineComment = (1 << 0), >> - C99 = (1 << 1), >> - C11 = (1 << 2), >> - CPlusPlus = (1 << 3), >> - CPlusPlus11 = (1 << 4), >> - CPlusPlus14 = (1 << 5), >> - CPlusPlus17 = (1 << 6), >> - CPlusPlus2a = (1 << 7), >> - Digraphs = (1 << 8), >> - GNUMode = (1 << 9), >> - HexFloat = (1 << 10), >> - ImplicitInt = (1 << 11), >> - OpenCL = (1 << 12) >> -}; >> - >> -} >> - >> -/// LangStandard - Information about the properties of a particular >> language >> -/// standard. >> -struct LangStandard { >> - enum Kind { >> -#define LANGSTANDARD(id, name, lang, desc, features) \ >> - lang_##id, >> -#include "clang/Frontend/LangStandards.def" >> - lang_unspecified >> - }; >> - >> - const char *ShortName; >> - const char *Description; >> - unsigned Flags; >> - InputKind::Language Language; >> - >> -public: >> - /// getName - Get the name of this standard. >> - const char *getName() const { return ShortName; } >> - >> - /// getDescription - Get the description of this standard. >> - const char *getDescription() const { return Description; } >> - >> - /// Get the language that this standard describes. >> - InputKind::Language getLanguage() const { return Language; } >> - >> - /// Language supports '//' comments. >> - bool hasLineComments() const { return Flags & frontend::LineComment; } >> - >> - /// isC99 - Language is a superset of C99. >> - bool isC99() const { return Flags & frontend::C99; } >> - >> - /// isC11 - Language is a superset of C11. >> - bool isC11() const { return Flags & frontend::C11; } >> - >> - /// isCPlusPlus - Language is a C++ variant. >> - bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; } >> - >> - /// isCPlusPlus11 - Language is a C++11 variant (or later). >> - bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; } >> - >> - /// isCPlusPlus14 - Language is a C++14 variant (or later). >> - bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; } >> - >> - /// isCPlusPlus17 - Language is a C++17 variant (or later). >> - bool isCPlusPlus17() const { return Flags & frontend::CPlusPlus17; } >> - >> - /// isCPlusPlus2a - Language is a post-C++17 variant (or later). >> - bool isCPlusPlus2a() const { return Flags & frontend::CPlusPlus2a; } >> - >> - >> - /// hasDigraphs - Language supports digraphs. >> - bool hasDigraphs() const { return Flags & frontend::Digraphs; } >> - >> - /// isGNUMode - Language includes GNU extensions. >> - bool isGNUMode() const { return Flags & frontend::GNUMode; } >> - >> - /// hasHexFloats - Language supports hexadecimal float constants. >> - bool hasHexFloats() const { return Flags & frontend::HexFloat; } >> - >> - /// hasImplicitInt - Language allows variables to be typed as int >> implicitly. >> - bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; } >> - >> - /// isOpenCL - Language is a OpenCL variant. >> - bool isOpenCL() const { return Flags & frontend::OpenCL; } >> - >> - static const LangStandard &getLangStandardForKind(Kind K); >> - static const LangStandard *getLangStandardForName(StringRef Name); >> -}; >> - >> -} // end namespace clang >> - >> -#endif >> +//===--- LangStandard.h -----------------------------------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LLVM_CLANG_FRONTEND_LANGSTANDARD_H >> +#define LLVM_CLANG_FRONTEND_LANGSTANDARD_H >> + >> +#include "clang/Basic/LLVM.h" >> +#include "clang/Frontend/FrontendOptions.h" >> +#include "llvm/ADT/StringRef.h" >> + >> +namespace clang { >> + >> +namespace frontend { >> + >> +enum LangFeatures { >> + LineComment = (1 << 0), >> + C99 = (1 << 1), >> + C11 = (1 << 2), >> + C17 = (1 << 3), >> + CPlusPlus = (1 << 4), >> + CPlusPlus11 = (1 << 5), >> + CPlusPlus14 = (1 << 6), >> + CPlusPlus17 = (1 << 7), >> + CPlusPlus2a = (1 << 8), >> + Digraphs = (1 << 9), >> + GNUMode = (1 << 10), >> + HexFloat = (1 << 11), >> + ImplicitInt = (1 << 12), >> + OpenCL = (1 << 13) >> +}; >> + >> +} >> + >> +/// LangStandard - Information about the properties of a particular >> language >> +/// standard. >> +struct LangStandard { >> + enum Kind { >> +#define LANGSTANDARD(id, name, lang, desc, features) \ >> + lang_##id, >> +#include "clang/Frontend/LangStandards.def" >> + lang_unspecified >> + }; >> + >> + const char *ShortName; >> + const char *Description; >> + unsigned Flags; >> + InputKind::Language Language; >> + >> +public: >> + /// getName - Get the name of this standard. >> + const char *getName() const { return ShortName; } >> + >> + /// getDescription - Get the description of this standard. >> + const char *getDescription() const { return Description; } >> + >> + /// Get the language that this standard describes. >> + InputKind::Language getLanguage() const { return Language; } >> + >> + /// Language supports '//' comments. >> + bool hasLineComments() const { return Flags & frontend::LineComment; } >> + >> + /// isC99 - Language is a superset of C99. >> + bool isC99() const { return Flags & frontend::C99; } >> + >> + /// isC11 - Language is a superset of C11. >> + bool isC11() const { return Flags & frontend::C11; } >> + >> + /// isC17 - Language is a superset of C17. >> + bool isC17() const { return Flags & frontend::C17; } >> + >> + /// isCPlusPlus - Language is a C++ variant. >> + bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; } >> + >> + /// isCPlusPlus11 - Language is a C++11 variant (or later). >> + bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; } >> + >> + /// isCPlusPlus14 - Language is a C++14 variant (or later). >> + bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; } >> + >> + /// isCPlusPlus17 - Language is a C++17 variant (or later). >> + bool isCPlusPlus17() const { return Flags & frontend::CPlusPlus17; } >> + >> + /// isCPlusPlus2a - Language is a post-C++17 variant (or later). >> + bool isCPlusPlus2a() const { return Flags & frontend::CPlusPlus2a; } >> + >> + >> + /// hasDigraphs - Language supports digraphs. >> + bool hasDigraphs() const { return Flags & frontend::Digraphs; } >> + >> + /// isGNUMode - Language includes GNU extensions. >> + bool isGNUMode() const { return Flags & frontend::GNUMode; } >> + >> + /// hasHexFloats - Language supports hexadecimal float constants. >> + bool hasHexFloats() const { return Flags & frontend::HexFloat; } >> + >> + /// hasImplicitInt - Language allows variables to be typed as int >> implicitly. >> + bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; } >> + >> + /// isOpenCL - Language is a OpenCL variant. >> + bool isOpenCL() const { return Flags & frontend::OpenCL; } >> + >> + static const LangStandard &getLangStandardForKind(Kind K); >> + static const LangStandard *getLangStandardForName(StringRef Name); >> +}; >> + >> +} // end namespace clang >> + >> +#endif >> >> Modified: cfe/trunk/include/clang/Frontend/LangStandards.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/LangStandards.def?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Frontend/LangStandards.def (original) >> +++ cfe/trunk/include/clang/Frontend/LangStandards.def Thu Dec 7 13:46:26 >> 2017 >> @@ -1,161 +1,170 @@ >> -//===-- LangStandards.def - Language Standard Data --------------*- C++ >> -*-===// >> -// >> -// The LLVM Compiler Infrastructure >> -// >> -// This file is distributed under the University of Illinois Open Source >> -// License. See LICENSE.TXT for details. >> -// >> >> -//===----------------------------------------------------------------------===// >> - >> -#ifndef LANGSTANDARD >> -#error "LANGSTANDARD must be defined before including this file" >> -#endif >> - >> -/// LANGSTANDARD(IDENT, NAME, LANG, DESC, FEATURES) >> -/// >> -/// \param IDENT - The name of the standard as a C++ identifier. >> -/// \param NAME - The name of the standard. >> -/// \param LANG - The InputKind::Language for which this is a standard. >> -/// \param DESC - A short description of the standard. >> -/// \param FEATURES - The standard features as flags, these are enums >> from the >> -/// clang::frontend namespace, which is assumed to be be available. >> - >> -/// LANGSTANDARD_ALIAS(IDENT, ALIAS) >> -/// \param IDENT - The name of the standard as a C++ identifier. >> -/// \param ALIAS - The alias of the standard. >> - >> -/// LANGSTANDARD_ALIAS_DEPR(IDENT, ALIAS) >> -/// Same as LANGSTANDARD_ALIAS, but for a deprecated alias. >> - >> -#ifndef LANGSTANDARD_ALIAS >> -#define LANGSTANDARD_ALIAS(IDENT, ALIAS) >> -#endif >> - >> -#ifndef LANGSTANDARD_ALIAS_DEPR >> -#define LANGSTANDARD_ALIAS_DEPR(IDENT, ALIAS) LANGSTANDARD_ALIAS(IDENT, >> ALIAS) >> -#endif >> - >> -// C89-ish modes. >> -LANGSTANDARD(c89, "c89", >> - C, "ISO C 1990", >> - ImplicitInt) >> -LANGSTANDARD_ALIAS(c89, "c90") >> -LANGSTANDARD_ALIAS(c89, "iso9899:1990") >> - >> -LANGSTANDARD(c94, "iso9899:199409", >> - C, "ISO C 1990 with amendment 1", >> - Digraphs | ImplicitInt) >> - >> -LANGSTANDARD(gnu89, "gnu89", >> - C, "ISO C 1990 with GNU extensions", >> - LineComment | Digraphs | GNUMode | ImplicitInt) >> -LANGSTANDARD_ALIAS(gnu89, "gnu90") >> - >> -// C99-ish modes >> -LANGSTANDARD(c99, "c99", >> - C, "ISO C 1999", >> - LineComment | C99 | Digraphs | HexFloat) >> -LANGSTANDARD_ALIAS(c99, "iso9899:1999") >> -LANGSTANDARD_ALIAS_DEPR(c99, "c9x") >> -LANGSTANDARD_ALIAS_DEPR(c99, "iso9899:199x") >> - >> -LANGSTANDARD(gnu99, "gnu99", >> - C, "ISO C 1999 with GNU extensions", >> - LineComment | C99 | Digraphs | GNUMode | HexFloat) >> -LANGSTANDARD_ALIAS_DEPR(gnu99, "gnu9x") >> - >> -// C11 modes >> -LANGSTANDARD(c11, "c11", >> - C, "ISO C 2011", >> - LineComment | C99 | C11 | Digraphs | HexFloat) >> -LANGSTANDARD_ALIAS(c11, "iso9899:2011") >> -LANGSTANDARD_ALIAS_DEPR(c11, "c1x") >> -LANGSTANDARD_ALIAS_DEPR(c11, "iso9899:201x") >> - >> -LANGSTANDARD(gnu11, "gnu11", >> - C, "ISO C 2011 with GNU extensions", >> - LineComment | C99 | C11 | Digraphs | GNUMode | HexFloat) >> -LANGSTANDARD_ALIAS_DEPR(gnu11, "gnu1x") >> - >> -// C++ modes >> -LANGSTANDARD(cxx98, "c++98", >> - CXX, "ISO C++ 1998 with amendments", >> - LineComment | CPlusPlus | Digraphs) >> -LANGSTANDARD_ALIAS(cxx98, "c++03") >> - >> -LANGSTANDARD(gnucxx98, "gnu++98", >> - CXX, "ISO C++ 1998 with amendments and GNU extensions", >> - LineComment | CPlusPlus | Digraphs | GNUMode) >> -LANGSTANDARD_ALIAS(gnucxx98, "gnu++03") >> - >> -LANGSTANDARD(cxx11, "c++11", >> - CXX, "ISO C++ 2011 with amendments", >> - LineComment | CPlusPlus | CPlusPlus11 | Digraphs) >> -LANGSTANDARD_ALIAS_DEPR(cxx11, "c++0x") >> - >> -LANGSTANDARD(gnucxx11, "gnu++11", CXX, >> - "ISO C++ 2011 with amendments and GNU extensions", >> - LineComment | CPlusPlus | CPlusPlus11 | Digraphs | GNUMode) >> -LANGSTANDARD_ALIAS_DEPR(gnucxx11, "gnu++0x") >> - >> -LANGSTANDARD(cxx14, "c++14", >> - CXX, "ISO C++ 2014 with amendments", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> Digraphs) >> -LANGSTANDARD_ALIAS_DEPR(cxx14, "c++1y") >> - >> -LANGSTANDARD(gnucxx14, "gnu++14", >> - CXX, "ISO C++ 2014 with amendments and GNU extensions", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> Digraphs | >> - GNUMode) >> -LANGSTANDARD_ALIAS_DEPR(gnucxx14, "gnu++1y") >> - >> -LANGSTANDARD(cxx17, "c++17", >> - CXX, "ISO C++ 2017 with amendments", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> - Digraphs | HexFloat) >> -LANGSTANDARD_ALIAS_DEPR(cxx17, "c++1z") >> - >> -LANGSTANDARD(gnucxx17, "gnu++17", >> - CXX, "ISO C++ 2017 with amendments and GNU extensions", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> - Digraphs | HexFloat | GNUMode) >> -LANGSTANDARD_ALIAS_DEPR(gnucxx17, "gnu++1z") >> - >> -LANGSTANDARD(cxx2a, "c++2a", >> - CXX, "Working draft for ISO C++ 2020", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> - CPlusPlus2a | Digraphs | HexFloat) >> - >> -LANGSTANDARD(gnucxx2a, "gnu++2a", >> - CXX, "Working draft for ISO C++ 2020 with GNU extensions", >> - LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> - CPlusPlus2a | Digraphs | HexFloat | GNUMode) >> - >> -// OpenCL >> -LANGSTANDARD(opencl10, "cl1.0", >> - OpenCL, "OpenCL 1.0", >> - LineComment | C99 | Digraphs | HexFloat | OpenCL) >> -LANGSTANDARD_ALIAS_DEPR(opencl10, "cl") >> - >> -LANGSTANDARD(opencl11, "cl1.1", >> - OpenCL, "OpenCL 1.1", >> - LineComment | C99 | Digraphs | HexFloat | OpenCL) >> -LANGSTANDARD(opencl12, "cl1.2", >> - OpenCL, "OpenCL 1.2", >> - LineComment | C99 | Digraphs | HexFloat | OpenCL) >> -LANGSTANDARD(opencl20, "cl2.0", >> - OpenCL, "OpenCL 2.0", >> - LineComment | C99 | Digraphs | HexFloat | OpenCL) >> - >> -LANGSTANDARD_ALIAS_DEPR(opencl10, "CL") >> -LANGSTANDARD_ALIAS_DEPR(opencl11, "CL1.1") >> -LANGSTANDARD_ALIAS_DEPR(opencl12, "CL1.2") >> -LANGSTANDARD_ALIAS_DEPR(opencl20, "CL2.0") >> - >> -// CUDA >> -LANGSTANDARD(cuda, "cuda", CUDA, "NVIDIA CUDA(tm)", >> - LineComment | CPlusPlus | Digraphs) >> - >> -#undef LANGSTANDARD >> -#undef LANGSTANDARD_ALIAS >> -#undef LANGSTANDARD_ALIAS_DEPR >> +//===-- LangStandards.def - Language Standard Data --------------*- C++ >> -*-===// >> +// >> +// The LLVM Compiler Infrastructure >> +// >> +// This file is distributed under the University of Illinois Open Source >> +// License. See LICENSE.TXT for details. >> +// >> >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LANGSTANDARD >> +#error "LANGSTANDARD must be defined before including this file" >> +#endif >> + >> +/// LANGSTANDARD(IDENT, NAME, LANG, DESC, FEATURES) >> +/// >> +/// \param IDENT - The name of the standard as a C++ identifier. >> +/// \param NAME - The name of the standard. >> +/// \param LANG - The InputKind::Language for which this is a standard. >> +/// \param DESC - A short description of the standard. >> +/// \param FEATURES - The standard features as flags, these are enums >> from the >> +/// clang::frontend namespace, which is assumed to be be available. >> + >> +/// LANGSTANDARD_ALIAS(IDENT, ALIAS) >> +/// \param IDENT - The name of the standard as a C++ identifier. >> +/// \param ALIAS - The alias of the standard. >> + >> +/// LANGSTANDARD_ALIAS_DEPR(IDENT, ALIAS) >> +/// Same as LANGSTANDARD_ALIAS, but for a deprecated alias. >> + >> +#ifndef LANGSTANDARD_ALIAS >> +#define LANGSTANDARD_ALIAS(IDENT, ALIAS) >> +#endif >> + >> +#ifndef LANGSTANDARD_ALIAS_DEPR >> +#define LANGSTANDARD_ALIAS_DEPR(IDENT, ALIAS) LANGSTANDARD_ALIAS(IDENT, >> ALIAS) >> +#endif >> + >> +// C89-ish modes. >> +LANGSTANDARD(c89, "c89", >> + C, "ISO C 1990", >> + ImplicitInt) >> +LANGSTANDARD_ALIAS(c89, "c90") >> +LANGSTANDARD_ALIAS(c89, "iso9899:1990") >> + >> +LANGSTANDARD(c94, "iso9899:199409", >> + C, "ISO C 1990 with amendment 1", >> + Digraphs | ImplicitInt) >> + >> +LANGSTANDARD(gnu89, "gnu89", >> + C, "ISO C 1990 with GNU extensions", >> + LineComment | Digraphs | GNUMode | ImplicitInt) >> +LANGSTANDARD_ALIAS(gnu89, "gnu90") >> + >> +// C99-ish modes >> +LANGSTANDARD(c99, "c99", >> + C, "ISO C 1999", >> + LineComment | C99 | Digraphs | HexFloat) >> +LANGSTANDARD_ALIAS(c99, "iso9899:1999") >> +LANGSTANDARD_ALIAS_DEPR(c99, "c9x") >> +LANGSTANDARD_ALIAS_DEPR(c99, "iso9899:199x") >> + >> +LANGSTANDARD(gnu99, "gnu99", >> + C, "ISO C 1999 with GNU extensions", >> + LineComment | C99 | Digraphs | GNUMode | HexFloat) >> +LANGSTANDARD_ALIAS_DEPR(gnu99, "gnu9x") >> + >> +// C11 modes >> +LANGSTANDARD(c11, "c11", >> + C, "ISO C 2011", >> + LineComment | C99 | C11 | Digraphs | HexFloat) >> +LANGSTANDARD_ALIAS(c11, "iso9899:2011") >> +LANGSTANDARD_ALIAS_DEPR(c11, "c1x") >> +LANGSTANDARD_ALIAS_DEPR(c11, "iso9899:201x") >> + >> +LANGSTANDARD(gnu11, "gnu11", >> + C, "ISO C 2011 with GNU extensions", >> + LineComment | C99 | C11 | Digraphs | GNUMode | HexFloat) >> +LANGSTANDARD_ALIAS_DEPR(gnu11, "gnu1x") >> + >> +// C17 modes >> +LANGSTANDARD(c17, "c17", >> + C, "ISO C 2017", >> + LineComment | C99 | C11 | C17 | Digraphs | HexFloat) >> +LANGSTANDARD_ALIAS(c17, "iso9899:2017") >> +LANGSTANDARD(gnu17, "gnu17", >> + C, "ISO C 2017 with GNU extensions", >> + LineComment | C99 | C11 | C17 | Digraphs | GNUMode | >> HexFloat) >> + >> +// C++ modes >> +LANGSTANDARD(cxx98, "c++98", >> + CXX, "ISO C++ 1998 with amendments", >> + LineComment | CPlusPlus | Digraphs) >> +LANGSTANDARD_ALIAS(cxx98, "c++03") >> + >> +LANGSTANDARD(gnucxx98, "gnu++98", >> + CXX, "ISO C++ 1998 with amendments and GNU extensions", >> + LineComment | CPlusPlus | Digraphs | GNUMode) >> +LANGSTANDARD_ALIAS(gnucxx98, "gnu++03") >> + >> +LANGSTANDARD(cxx11, "c++11", >> + CXX, "ISO C++ 2011 with amendments", >> + LineComment | CPlusPlus | CPlusPlus11 | Digraphs) >> +LANGSTANDARD_ALIAS_DEPR(cxx11, "c++0x") >> + >> +LANGSTANDARD(gnucxx11, "gnu++11", CXX, >> + "ISO C++ 2011 with amendments and GNU extensions", >> + LineComment | CPlusPlus | CPlusPlus11 | Digraphs | GNUMode) >> +LANGSTANDARD_ALIAS_DEPR(gnucxx11, "gnu++0x") >> + >> +LANGSTANDARD(cxx14, "c++14", >> + CXX, "ISO C++ 2014 with amendments", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> Digraphs) >> +LANGSTANDARD_ALIAS_DEPR(cxx14, "c++1y") >> + >> +LANGSTANDARD(gnucxx14, "gnu++14", >> + CXX, "ISO C++ 2014 with amendments and GNU extensions", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> Digraphs | >> + GNUMode) >> +LANGSTANDARD_ALIAS_DEPR(gnucxx14, "gnu++1y") >> + >> +LANGSTANDARD(cxx17, "c++17", >> + CXX, "ISO C++ 2017 with amendments", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> + Digraphs | HexFloat) >> +LANGSTANDARD_ALIAS_DEPR(cxx17, "c++1z") >> + >> +LANGSTANDARD(gnucxx17, "gnu++17", >> + CXX, "ISO C++ 2017 with amendments and GNU extensions", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> + Digraphs | HexFloat | GNUMode) >> +LANGSTANDARD_ALIAS_DEPR(gnucxx17, "gnu++1z") >> + >> +LANGSTANDARD(cxx2a, "c++2a", >> + CXX, "Working draft for ISO C++ 2020", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> + CPlusPlus2a | Digraphs | HexFloat) >> + >> +LANGSTANDARD(gnucxx2a, "gnu++2a", >> + CXX, "Working draft for ISO C++ 2020 with GNU extensions", >> + LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | >> CPlusPlus17 | >> + CPlusPlus2a | Digraphs | HexFloat | GNUMode) >> + >> +// OpenCL >> +LANGSTANDARD(opencl10, "cl1.0", >> + OpenCL, "OpenCL 1.0", >> + LineComment | C99 | Digraphs | HexFloat | OpenCL) >> +LANGSTANDARD_ALIAS_DEPR(opencl10, "cl") >> + >> +LANGSTANDARD(opencl11, "cl1.1", >> + OpenCL, "OpenCL 1.1", >> + LineComment | C99 | Digraphs | HexFloat | OpenCL) >> +LANGSTANDARD(opencl12, "cl1.2", >> + OpenCL, "OpenCL 1.2", >> + LineComment | C99 | Digraphs | HexFloat | OpenCL) >> +LANGSTANDARD(opencl20, "cl2.0", >> + OpenCL, "OpenCL 2.0", >> + LineComment | C99 | Digraphs | HexFloat | OpenCL) >> + >> +LANGSTANDARD_ALIAS_DEPR(opencl10, "CL") >> +LANGSTANDARD_ALIAS_DEPR(opencl11, "CL1.1") >> +LANGSTANDARD_ALIAS_DEPR(opencl12, "CL1.2") >> +LANGSTANDARD_ALIAS_DEPR(opencl20, "CL2.0") >> + >> +// CUDA >> +LANGSTANDARD(cuda, "cuda", CUDA, "NVIDIA CUDA(tm)", >> + LineComment | CPlusPlus | Digraphs) >> + >> +#undef LANGSTANDARD >> +#undef LANGSTANDARD_ALIAS >> +#undef LANGSTANDARD_ALIAS_DEPR >> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Dec 7 13:46:26 2017 >> @@ -1645,206 +1645,207 @@ static void ParseHeaderSearchArgs(Header >> Opts.AddPath(Prefix.str() + A->getValue(), frontend::Angled, false, >> true); >> } >> >> - for (const Arg *A : Args.filtered(OPT_idirafter)) >> - Opts.AddPath(A->getValue(), frontend::After, false, true); >> - for (const Arg *A : Args.filtered(OPT_iquote)) >> - Opts.AddPath(A->getValue(), frontend::Quoted, false, true); >> - for (const Arg *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) >> - Opts.AddPath(A->getValue(), frontend::System, false, >> - !A->getOption().matches(OPT_iwithsysroot)); >> - for (const Arg *A : Args.filtered(OPT_iframework)) >> - Opts.AddPath(A->getValue(), frontend::System, true, true); >> - for (const Arg *A : Args.filtered(OPT_iframeworkwithsysroot)) >> - Opts.AddPath(A->getValue(), frontend::System, /*IsFramework=*/true, >> - /*IgnoreSysRoot=*/false); >> - >> - // Add the paths for the various language specific isystem flags. >> - for (const Arg *A : Args.filtered(OPT_c_isystem)) >> - Opts.AddPath(A->getValue(), frontend::CSystem, false, true); >> - for (const Arg *A : Args.filtered(OPT_cxx_isystem)) >> - Opts.AddPath(A->getValue(), frontend::CXXSystem, false, true); >> - for (const Arg *A : Args.filtered(OPT_objc_isystem)) >> - Opts.AddPath(A->getValue(), frontend::ObjCSystem, false,true); >> - for (const Arg *A : Args.filtered(OPT_objcxx_isystem)) >> - Opts.AddPath(A->getValue(), frontend::ObjCXXSystem, false, true); >> - >> - // Add the internal paths from a driver that detects standard include >> paths. >> - for (const Arg *A : >> - Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) >> { >> - frontend::IncludeDirGroup Group = frontend::System; >> - if (A->getOption().matches(OPT_internal_externc_isystem)) >> - Group = frontend::ExternCSystem; >> - Opts.AddPath(A->getValue(), Group, false, true); >> - } >> - >> - // Add the path prefixes which are implicitly treated as being system >> headers. >> - for (const Arg *A : >> - Args.filtered(OPT_system_header_prefix, >> OPT_no_system_header_prefix)) >> - Opts.AddSystemHeaderPrefix( >> - A->getValue(), A->getOption().matches(OPT_system_header_prefix)); >> - >> - for (const Arg *A : Args.filtered(OPT_ivfsoverlay)) >> - Opts.AddVFSOverlayFile(A->getValue()); >> -} >> - >> -void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, >> - const llvm::Triple &T, >> - PreprocessorOptions &PPOpts, >> - LangStandard::Kind LangStd) { >> - // Set some properties which depend solely on the input kind; it would >> be nice >> - // to move these to the language standard, and have the driver resolve >> the >> - // input kind + language standard. >> - // >> - // FIXME: Perhaps a better model would be for a single source file to >> have >> - // multiple language standards (C / C++ std, ObjC std, OpenCL std, >> OpenMP std) >> - // simultaneously active? >> - if (IK.getLanguage() == InputKind::Asm) { >> - Opts.AsmPreprocessor = 1; >> - } else if (IK.isObjectiveC()) { >> - Opts.ObjC1 = Opts.ObjC2 = 1; >> - } >> - >> - if (LangStd == LangStandard::lang_unspecified) { >> - // Based on the base language, pick one. >> - switch (IK.getLanguage()) { >> - case InputKind::Unknown: >> - case InputKind::LLVM_IR: >> - llvm_unreachable("Invalid input kind!"); >> - case InputKind::OpenCL: >> - LangStd = LangStandard::lang_opencl10; >> - break; >> - case InputKind::CUDA: >> - LangStd = LangStandard::lang_cuda; >> - break; >> - case InputKind::Asm: >> - case InputKind::C: >> - // The PS4 uses C99 as the default C standard. >> - if (T.isPS4()) >> - LangStd = LangStandard::lang_gnu99; >> - else >> - LangStd = LangStandard::lang_gnu11; >> - break; >> - case InputKind::ObjC: >> - LangStd = LangStandard::lang_gnu11; >> - break; >> - case InputKind::CXX: >> - case InputKind::ObjCXX: >> - // The PS4 uses C++11 as the default C++ standard. >> - if (T.isPS4()) >> - LangStd = LangStandard::lang_gnucxx11; >> - else >> - LangStd = LangStandard::lang_gnucxx98; >> - break; >> - case InputKind::RenderScript: >> - LangStd = LangStandard::lang_c99; >> - break; >> - } >> - } >> - >> - const LangStandard &Std = >> LangStandard::getLangStandardForKind(LangStd); >> - Opts.LineComment = Std.hasLineComments(); >> - Opts.C99 = Std.isC99(); >> - Opts.C11 = Std.isC11(); >> - Opts.CPlusPlus = Std.isCPlusPlus(); >> - Opts.CPlusPlus11 = Std.isCPlusPlus11(); >> - Opts.CPlusPlus14 = Std.isCPlusPlus14(); >> - Opts.CPlusPlus17 = Std.isCPlusPlus17(); >> - Opts.CPlusPlus2a = Std.isCPlusPlus2a(); >> - Opts.Digraphs = Std.hasDigraphs(); >> - Opts.GNUMode = Std.isGNUMode(); >> - Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus; >> - Opts.HexFloats = Std.hasHexFloats(); >> - Opts.ImplicitInt = Std.hasImplicitInt(); >> - >> - // Set OpenCL Version. >> - Opts.OpenCL = Std.isOpenCL(); >> - if (LangStd == LangStandard::lang_opencl10) >> - Opts.OpenCLVersion = 100; >> - else if (LangStd == LangStandard::lang_opencl11) >> - Opts.OpenCLVersion = 110; >> - else if (LangStd == LangStandard::lang_opencl12) >> - Opts.OpenCLVersion = 120; >> - else if (LangStd == LangStandard::lang_opencl20) >> - Opts.OpenCLVersion = 200; >> - >> - // OpenCL has some additional defaults. >> - if (Opts.OpenCL) { >> - Opts.AltiVec = 0; >> - Opts.ZVector = 0; >> - Opts.LaxVectorConversions = 0; >> - Opts.setDefaultFPContractMode(LangOptions::FPC_On); >> - Opts.NativeHalfType = 1; >> - Opts.NativeHalfArgsAndReturns = 1; >> - // Include default header file for OpenCL. >> - if (Opts.IncludeDefaultHeader) { >> - PPOpts.Includes.push_back("opencl-c.h"); >> - } >> - } >> - >> - Opts.CUDA = IK.getLanguage() == InputKind::CUDA; >> - if (Opts.CUDA) >> - // Set default FP_CONTRACT to FAST. >> - Opts.setDefaultFPContractMode(LangOptions::FPC_Fast); >> - >> - Opts.RenderScript = IK.getLanguage() == InputKind::RenderScript; >> - if (Opts.RenderScript) { >> - Opts.NativeHalfType = 1; >> - Opts.NativeHalfArgsAndReturns = 1; >> - } >> - >> - // OpenCL and C++ both have bool, true, false keywords. >> - Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; >> - >> - // OpenCL has half keyword >> - Opts.Half = Opts.OpenCL; >> - >> - // C++ has wchar_t keyword. >> - Opts.WChar = Opts.CPlusPlus; >> - >> - Opts.GNUKeywords = Opts.GNUMode; >> - Opts.CXXOperatorNames = Opts.CPlusPlus; >> - >> - Opts.AlignedAllocation = Opts.CPlusPlus17; >> - >> - Opts.DollarIdents = !Opts.AsmPreprocessor; >> -} >> - >> -/// Attempt to parse a visibility value out of the given argument. >> -static Visibility parseVisibility(Arg *arg, ArgList &args, >> - DiagnosticsEngine &diags) { >> - StringRef value = arg->getValue(); >> - if (value == "default") { >> - return DefaultVisibility; >> - } else if (value == "hidden" || value == "internal") { >> - return HiddenVisibility; >> - } else if (value == "protected") { >> - // FIXME: diagnose if target does not support protected visibility >> - return ProtectedVisibility; >> - } >> - >> - diags.Report(diag::err_drv_invalid_value) >> - << arg->getAsString(args) << value; >> - return DefaultVisibility; >> -} >> - >> -/// Check if input file kind and language standard are compatible. >> -static bool IsInputCompatibleWithStandard(InputKind IK, >> - const LangStandard &S) { >> - switch (IK.getLanguage()) { >> - case InputKind::Unknown: >> - case InputKind::LLVM_IR: >> - llvm_unreachable("should not parse language flags for this input"); >> - >> - case InputKind::C: >> - case InputKind::ObjC: >> - case InputKind::RenderScript: >> - return S.getLanguage() == InputKind::C; >> - >> - case InputKind::OpenCL: >> - return S.getLanguage() == InputKind::OpenCL; >> - >> - case InputKind::CXX: >> - case InputKind::ObjCXX: >> + for (const Arg *A : Args.filtered(OPT_idirafter)) >> + Opts.AddPath(A->getValue(), frontend::After, false, true); >> + for (const Arg *A : Args.filtered(OPT_iquote)) >> + Opts.AddPath(A->getValue(), frontend::Quoted, false, true); >> + for (const Arg *A : Args.filtered(OPT_isystem, OPT_iwithsysroot)) >> + Opts.AddPath(A->getValue(), frontend::System, false, >> + !A->getOption().matches(OPT_iwithsysroot)); >> + for (const Arg *A : Args.filtered(OPT_iframework)) >> + Opts.AddPath(A->getValue(), frontend::System, true, true); >> + for (const Arg *A : Args.filtered(OPT_iframeworkwithsysroot)) >> + Opts.AddPath(A->getValue(), frontend::System, /*IsFramework=*/true, >> + /*IgnoreSysRoot=*/false); >> + >> + // Add the paths for the various language specific isystem flags. >> + for (const Arg *A : Args.filtered(OPT_c_isystem)) >> + Opts.AddPath(A->getValue(), frontend::CSystem, false, true); >> + for (const Arg *A : Args.filtered(OPT_cxx_isystem)) >> + Opts.AddPath(A->getValue(), frontend::CXXSystem, false, true); >> + for (const Arg *A : Args.filtered(OPT_objc_isystem)) >> + Opts.AddPath(A->getValue(), frontend::ObjCSystem, false,true); >> + for (const Arg *A : Args.filtered(OPT_objcxx_isystem)) >> + Opts.AddPath(A->getValue(), frontend::ObjCXXSystem, false, true); >> + >> + // Add the internal paths from a driver that detects standard include >> paths. >> + for (const Arg *A : >> + Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) >> { >> + frontend::IncludeDirGroup Group = frontend::System; >> + if (A->getOption().matches(OPT_internal_externc_isystem)) >> + Group = frontend::ExternCSystem; >> + Opts.AddPath(A->getValue(), Group, false, true); >> + } >> + >> + // Add the path prefixes which are implicitly treated as being system >> headers. >> + for (const Arg *A : >> + Args.filtered(OPT_system_header_prefix, >> OPT_no_system_header_prefix)) >> + Opts.AddSystemHeaderPrefix( >> + A->getValue(), A->getOption().matches(OPT_system_header_prefix)); >> + >> + for (const Arg *A : Args.filtered(OPT_ivfsoverlay)) >> + Opts.AddVFSOverlayFile(A->getValue()); >> +} >> + >> +void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, >> + const llvm::Triple &T, >> + PreprocessorOptions &PPOpts, >> + LangStandard::Kind LangStd) { >> + // Set some properties which depend solely on the input kind; it would >> be nice >> + // to move these to the language standard, and have the driver resolve >> the >> + // input kind + language standard. >> + // >> + // FIXME: Perhaps a better model would be for a single source file to >> have >> + // multiple language standards (C / C++ std, ObjC std, OpenCL std, >> OpenMP std) >> + // simultaneously active? >> + if (IK.getLanguage() == InputKind::Asm) { >> + Opts.AsmPreprocessor = 1; >> + } else if (IK.isObjectiveC()) { >> + Opts.ObjC1 = Opts.ObjC2 = 1; >> + } >> + >> + if (LangStd == LangStandard::lang_unspecified) { >> + // Based on the base language, pick one. >> + switch (IK.getLanguage()) { >> + case InputKind::Unknown: >> + case InputKind::LLVM_IR: >> + llvm_unreachable("Invalid input kind!"); >> + case InputKind::OpenCL: >> + LangStd = LangStandard::lang_opencl10; >> + break; >> + case InputKind::CUDA: >> + LangStd = LangStandard::lang_cuda; >> + break; >> + case InputKind::Asm: >> + case InputKind::C: >> + // The PS4 uses C99 as the default C standard. >> + if (T.isPS4()) >> + LangStd = LangStandard::lang_gnu99; >> + else >> + LangStd = LangStandard::lang_gnu11; >> + break; >> + case InputKind::ObjC: >> + LangStd = LangStandard::lang_gnu11; >> + break; >> + case InputKind::CXX: >> + case InputKind::ObjCXX: >> + // The PS4 uses C++11 as the default C++ standard. >> + if (T.isPS4()) >> + LangStd = LangStandard::lang_gnucxx11; >> + else >> + LangStd = LangStandard::lang_gnucxx98; >> + break; >> + case InputKind::RenderScript: >> + LangStd = LangStandard::lang_c99; >> + break; >> + } >> + } >> + >> + const LangStandard &Std = >> LangStandard::getLangStandardForKind(LangStd); >> + Opts.LineComment = Std.hasLineComments(); >> + Opts.C99 = Std.isC99(); >> + Opts.C11 = Std.isC11(); >> + Opts.C17 = Std.isC17(); >> + Opts.CPlusPlus = Std.isCPlusPlus(); >> + Opts.CPlusPlus11 = Std.isCPlusPlus11(); >> + Opts.CPlusPlus14 = Std.isCPlusPlus14(); >> + Opts.CPlusPlus17 = Std.isCPlusPlus17(); >> + Opts.CPlusPlus2a = Std.isCPlusPlus2a(); >> + Opts.Digraphs = Std.hasDigraphs(); >> + Opts.GNUMode = Std.isGNUMode(); >> + Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus; >> + Opts.HexFloats = Std.hasHexFloats(); >> + Opts.ImplicitInt = Std.hasImplicitInt(); >> + >> + // Set OpenCL Version. >> + Opts.OpenCL = Std.isOpenCL(); >> + if (LangStd == LangStandard::lang_opencl10) >> + Opts.OpenCLVersion = 100; >> + else if (LangStd == LangStandard::lang_opencl11) >> + Opts.OpenCLVersion = 110; >> + else if (LangStd == LangStandard::lang_opencl12) >> + Opts.OpenCLVersion = 120; >> + else if (LangStd == LangStandard::lang_opencl20) >> + Opts.OpenCLVersion = 200; >> + >> + // OpenCL has some additional defaults. >> + if (Opts.OpenCL) { >> + Opts.AltiVec = 0; >> + Opts.ZVector = 0; >> + Opts.LaxVectorConversions = 0; >> + Opts.setDefaultFPContractMode(LangOptions::FPC_On); >> + Opts.NativeHalfType = 1; >> + Opts.NativeHalfArgsAndReturns = 1; >> + // Include default header file for OpenCL. >> + if (Opts.IncludeDefaultHeader) { >> + PPOpts.Includes.push_back("opencl-c.h"); >> + } >> + } >> + >> + Opts.CUDA = IK.getLanguage() == InputKind::CUDA; >> + if (Opts.CUDA) >> + // Set default FP_CONTRACT to FAST. >> + Opts.setDefaultFPContractMode(LangOptions::FPC_Fast); >> + >> + Opts.RenderScript = IK.getLanguage() == InputKind::RenderScript; >> + if (Opts.RenderScript) { >> + Opts.NativeHalfType = 1; >> + Opts.NativeHalfArgsAndReturns = 1; >> + } >> + >> + // OpenCL and C++ both have bool, true, false keywords. >> + Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; >> + >> + // OpenCL has half keyword >> + Opts.Half = Opts.OpenCL; >> + >> + // C++ has wchar_t keyword. >> + Opts.WChar = Opts.CPlusPlus; >> + >> + Opts.GNUKeywords = Opts.GNUMode; >> + Opts.CXXOperatorNames = Opts.CPlusPlus; >> + >> + Opts.AlignedAllocation = Opts.CPlusPlus17; >> + >> + Opts.DollarIdents = !Opts.AsmPreprocessor; >> +} >> + >> +/// Attempt to parse a visibility value out of the given argument. >> +static Visibility parseVisibility(Arg *arg, ArgList &args, >> + DiagnosticsEngine &diags) { >> + StringRef value = arg->getValue(); >> + if (value == "default") { >> + return DefaultVisibility; >> + } else if (value == "hidden" || value == "internal") { >> + return HiddenVisibility; >> + } else if (value == "protected") { >> + // FIXME: diagnose if target does not support protected visibility >> + return ProtectedVisibility; >> + } >> + >> + diags.Report(diag::err_drv_invalid_value) >> + << arg->getAsString(args) << value; >> + return DefaultVisibility; >> +} >> + >> +/// Check if input file kind and language standard are compatible. >> +static bool IsInputCompatibleWithStandard(InputKind IK, >> + const LangStandard &S) { >> + switch (IK.getLanguage()) { >> + case InputKind::Unknown: >> + case InputKind::LLVM_IR: >> + llvm_unreachable("should not parse language flags for this input"); >> + >> + case InputKind::C: >> + case InputKind::ObjC: >> + case InputKind::RenderScript: >> + return S.getLanguage() == InputKind::C; >> + >> + case InputKind::OpenCL: >> + return S.getLanguage() == InputKind::OpenCL; >> + >> + case InputKind::CXX: >> + case InputKind::ObjCXX: >> return S.getLanguage() == InputKind::CXX; >> >> case InputKind::CUDA: >> >> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original) >> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Thu Dec 7 13:46:26 2017 >> @@ -270,207 +270,209 @@ static void DefineLeastWidthIntType(unsi >> DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); >> DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); >> } >> - >> -static void DefineFastIntType(unsigned TypeWidth, bool IsSigned, >> - const TargetInfo &TI, MacroBuilder >> &Builder) { >> - // stdint.h currently defines the fast int types as equivalent to the >> least >> - // types. >> - TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, >> IsSigned); >> - if (Ty == TargetInfo::NoInt) >> - return; >> - >> - const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST"; >> - DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); >> - DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); >> - >> - DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); >> -} >> - >> - >> -/// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type >> with >> -/// the specified properties. >> -static const char *getLockFreeValue(unsigned TypeWidth, unsigned >> TypeAlign, >> - unsigned InlineWidth) { >> - // Fully-aligned, power-of-2 sizes no larger than the inline >> - // width will be inlined as lock-free operations. >> - if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 && >> - TypeWidth <= InlineWidth) >> - return "2"; // "always lock free" >> - // We cannot be certain what operations the lib calls might be >> - // able to implement as lock-free on future processors. >> - return "1"; // "sometimes lock free" >> -} >> - >> -/// \brief Add definitions required for a smooth interaction between >> -/// Objective-C++ automated reference counting and libstdc++ (4.2). >> -static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, >> - MacroBuilder &Builder) { >> - Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); >> - >> - std::string Result; >> - { >> - // Provide specializations for the __is_scalar type trait so that >> - // lifetime-qualified objects are not considered "scalar" types, >> which >> - // libstdc++ uses as an indicator of the presence of trivial copy, >> assign, >> - // default-construct, and destruct semantics (none of which hold for >> - // lifetime-qualified objects in ARC). >> - llvm::raw_string_ostream Out(Result); >> - >> - Out << "namespace std {\n" >> - << "\n" >> - << "struct __true_type;\n" >> - << "struct __false_type;\n" >> - << "\n"; >> - >> - Out << "template<typename _Tp> struct __is_scalar;\n" >> - << "\n"; >> - >> - if (LangOpts.ObjCAutoRefCount) { >> - Out << "template<typename _Tp>\n" >> - << "struct __is_scalar<__attribute__((objc_ownership(strong))) >> _Tp> {\n" >> - << " enum { __value = 0 };\n" >> - << " typedef __false_type __type;\n" >> - << "};\n" >> - << "\n"; >> - } >> - >> - if (LangOpts.ObjCWeak) { >> - Out << "template<typename _Tp>\n" >> - << "struct __is_scalar<__attribute__((objc_ownership(weak))) >> _Tp> {\n" >> - << " enum { __value = 0 };\n" >> - << " typedef __false_type __type;\n" >> - << "};\n" >> - << "\n"; >> - } >> - >> - if (LangOpts.ObjCAutoRefCount) { >> - Out << "template<typename _Tp>\n" >> - << "struct >> __is_scalar<__attribute__((objc_ownership(autoreleasing)))" >> - << " _Tp> {\n" >> - << " enum { __value = 0 };\n" >> - << " typedef __false_type __type;\n" >> - << "};\n" >> - << "\n"; >> - } >> - >> - Out << "}\n"; >> - } >> - Builder.append(Result); >> -} >> - >> -static void InitializeStandardPredefinedMacros(const TargetInfo &TI, >> - const LangOptions >> &LangOpts, >> - const FrontendOptions >> &FEOpts, >> - MacroBuilder &Builder) { >> - if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP) >> - Builder.defineMacro("__STDC__"); >> - if (LangOpts.Freestanding) >> - Builder.defineMacro("__STDC_HOSTED__", "0"); >> - else >> - Builder.defineMacro("__STDC_HOSTED__"); >> - >> - if (!LangOpts.CPlusPlus) { >> - if (LangOpts.C11) >> - Builder.defineMacro("__STDC_VERSION__", "201112L"); >> - else if (LangOpts.C99) >> - Builder.defineMacro("__STDC_VERSION__", "199901L"); >> - else if (!LangOpts.GNUMode && LangOpts.Digraphs) >> - Builder.defineMacro("__STDC_VERSION__", "199409L"); >> - } else { >> - // FIXME: Use correct value for C++20. >> - if (LangOpts.CPlusPlus2a) >> - Builder.defineMacro("__cplusplus", "201707L"); >> - // C++17 [cpp.predefined]p1: >> - // The name __cplusplus is defined to the value 201703L when >> compiling a >> - // C++ translation unit. >> - else if (LangOpts.CPlusPlus17) >> - Builder.defineMacro("__cplusplus", "201703L"); >> - // C++1y [cpp.predefined]p1: >> - // The name __cplusplus is defined to the value 201402L when >> compiling a >> - // C++ translation unit. >> - else if (LangOpts.CPlusPlus14) >> - Builder.defineMacro("__cplusplus", "201402L"); >> - // C++11 [cpp.predefined]p1: >> - // The name __cplusplus is defined to the value 201103L when >> compiling a >> - // C++ translation unit. >> - else if (LangOpts.CPlusPlus11) >> - Builder.defineMacro("__cplusplus", "201103L"); >> - // C++03 [cpp.predefined]p1: >> - // The name __cplusplus is defined to the value 199711L when >> compiling a >> - // C++ translation unit. >> - else >> - Builder.defineMacro("__cplusplus", "199711L"); >> - >> - // C++1z [cpp.predefined]p1: >> - // An integer literal of type std::size_t whose value is the >> alignment >> - // guaranteed by a call to operator new(std::size_t) >> - // >> - // We provide this in all language modes, since it seems generally >> useful. >> - Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__", >> - Twine(TI.getNewAlign() / TI.getCharWidth()) + >> - TI.getTypeConstantSuffix(TI.getSizeType())); >> - } >> - >> - // In C11 these are environment macros. In C++11 they are only defined >> - // as part of <cuchar>. To prevent breakage when mixing C and C++ >> - // code, define these macros unconditionally. We can define them >> - // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit >> - // and 32-bit character literals. >> - Builder.defineMacro("__STDC_UTF_16__", "1"); >> - Builder.defineMacro("__STDC_UTF_32__", "1"); >> - >> - if (LangOpts.ObjC1) >> - Builder.defineMacro("__OBJC__"); >> - >> - // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and >> Macros. >> - if (LangOpts.OpenCL) { >> - // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate >> the >> - // language standard with which the program is compiled. >> __OPENCL_VERSION__ >> - // is for the OpenCL version supported by the OpenCL device, which is >> not >> - // necessarily the language standard with which the program is >> compiled. >> - // A shared OpenCL header file requires a macro to indicate the >> language >> - // standard. As a workaround, __OPENCL_C_VERSION__ is defined for >> - // OpenCL v1.0 and v1.1. >> - switch (LangOpts.OpenCLVersion) { >> - case 100: >> - Builder.defineMacro("__OPENCL_C_VERSION__", "100"); >> - break; >> - case 110: >> - Builder.defineMacro("__OPENCL_C_VERSION__", "110"); >> - break; >> - case 120: >> - Builder.defineMacro("__OPENCL_C_VERSION__", "120"); >> - break; >> - case 200: >> - Builder.defineMacro("__OPENCL_C_VERSION__", "200"); >> - break; >> - default: >> - llvm_unreachable("Unsupported OpenCL version"); >> - } >> - Builder.defineMacro("CL_VERSION_1_0", "100"); >> - Builder.defineMacro("CL_VERSION_1_1", "110"); >> - Builder.defineMacro("CL_VERSION_1_2", "120"); >> - Builder.defineMacro("CL_VERSION_2_0", "200"); >> - >> - if (TI.isLittleEndian()) >> - Builder.defineMacro("__ENDIAN_LITTLE__"); >> - >> - if (LangOpts.FastRelaxedMath) >> - Builder.defineMacro("__FAST_RELAXED_MATH__"); >> - } >> - // Not "standard" per se, but available even with the -undef flag. >> - if (LangOpts.AsmPreprocessor) >> - Builder.defineMacro("__ASSEMBLER__"); >> - if (LangOpts.CUDA) >> - Builder.defineMacro("__CUDA__"); >> -} >> - >> -/// Initialize the predefined C++ language feature test macros defined in >> -/// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test >> Recommendations". >> -static void InitializeCPlusPlusFeatureTestMacros(const LangOptions >> &LangOpts, >> - MacroBuilder &Builder) { >> - // C++98 features. >> - if (LangOpts.RTTI) >> + >> +static void DefineFastIntType(unsigned TypeWidth, bool IsSigned, >> + const TargetInfo &TI, MacroBuilder >> &Builder) { >> + // stdint.h currently defines the fast int types as equivalent to the >> least >> + // types. >> + TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, >> IsSigned); >> + if (Ty == TargetInfo::NoInt) >> + return; >> + >> + const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST"; >> + DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); >> + DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); >> + >> + DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); >> +} >> + >> + >> +/// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type >> with >> +/// the specified properties. >> +static const char *getLockFreeValue(unsigned TypeWidth, unsigned >> TypeAlign, >> + unsigned InlineWidth) { >> + // Fully-aligned, power-of-2 sizes no larger than the inline >> + // width will be inlined as lock-free operations. >> + if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 && >> + TypeWidth <= InlineWidth) >> + return "2"; // "always lock free" >> + // We cannot be certain what operations the lib calls might be >> + // able to implement as lock-free on future processors. >> + return "1"; // "sometimes lock free" >> +} >> + >> +/// \brief Add definitions required for a smooth interaction between >> +/// Objective-C++ automated reference counting and libstdc++ (4.2). >> +static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, >> + MacroBuilder &Builder) { >> + Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); >> + >> + std::string Result; >> + { >> + // Provide specializations for the __is_scalar type trait so that >> + // lifetime-qualified objects are not considered "scalar" types, >> which >> + // libstdc++ uses as an indicator of the presence of trivial copy, >> assign, >> + // default-construct, and destruct semantics (none of which hold for >> + // lifetime-qualified objects in ARC). >> + llvm::raw_string_ostream Out(Result); >> + >> + Out << "namespace std {\n" >> + << "\n" >> + << "struct __true_type;\n" >> + << "struct __false_type;\n" >> + << "\n"; >> + >> + Out << "template<typename _Tp> struct __is_scalar;\n" >> + << "\n"; >> + >> + if (LangOpts.ObjCAutoRefCount) { >> + Out << "template<typename _Tp>\n" >> + << "struct __is_scalar<__attribute__((objc_ownership(strong))) >> _Tp> {\n" >> + << " enum { __value = 0 };\n" >> + << " typedef __false_type __type;\n" >> + << "};\n" >> + << "\n"; >> + } >> + >> + if (LangOpts.ObjCWeak) { >> + Out << "template<typename _Tp>\n" >> + << "struct __is_scalar<__attribute__((objc_ownership(weak))) >> _Tp> {\n" >> + << " enum { __value = 0 };\n" >> + << " typedef __false_type __type;\n" >> + << "};\n" >> + << "\n"; >> + } >> + >> + if (LangOpts.ObjCAutoRefCount) { >> + Out << "template<typename _Tp>\n" >> + << "struct >> __is_scalar<__attribute__((objc_ownership(autoreleasing)))" >> + << " _Tp> {\n" >> + << " enum { __value = 0 };\n" >> + << " typedef __false_type __type;\n" >> + << "};\n" >> + << "\n"; >> + } >> + >> + Out << "}\n"; >> + } >> + Builder.append(Result); >> +} >> + >> +static void InitializeStandardPredefinedMacros(const TargetInfo &TI, >> + const LangOptions >> &LangOpts, >> + const FrontendOptions >> &FEOpts, >> + MacroBuilder &Builder) { >> + if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP) >> + Builder.defineMacro("__STDC__"); >> + if (LangOpts.Freestanding) >> + Builder.defineMacro("__STDC_HOSTED__", "0"); >> + else >> + Builder.defineMacro("__STDC_HOSTED__"); >> + >> + if (!LangOpts.CPlusPlus) { >> + if (LangOpts.C17) >> + Builder.defineMacro("__STDC_VERSION__", "201710L"); >> + else if (LangOpts.C11) >> + Builder.defineMacro("__STDC_VERSION__", "201112L"); >> + else if (LangOpts.C99) >> + Builder.defineMacro("__STDC_VERSION__", "199901L"); >> + else if (!LangOpts.GNUMode && LangOpts.Digraphs) >> + Builder.defineMacro("__STDC_VERSION__", "199409L"); >> + } else { >> + // FIXME: Use correct value for C++20. >> + if (LangOpts.CPlusPlus2a) >> + Builder.defineMacro("__cplusplus", "201707L"); >> + // C++17 [cpp.predefined]p1: >> + // The name __cplusplus is defined to the value 201703L when >> compiling a >> + // C++ translation unit. >> + else if (LangOpts.CPlusPlus17) >> + Builder.defineMacro("__cplusplus", "201703L"); >> + // C++1y [cpp.predefined]p1: >> + // The name __cplusplus is defined to the value 201402L when >> compiling a >> + // C++ translation unit. >> + else if (LangOpts.CPlusPlus14) >> + Builder.defineMacro("__cplusplus", "201402L"); >> + // C++11 [cpp.predefined]p1: >> + // The name __cplusplus is defined to the value 201103L when >> compiling a >> + // C++ translation unit. >> + else if (LangOpts.CPlusPlus11) >> + Builder.defineMacro("__cplusplus", "201103L"); >> + // C++03 [cpp.predefined]p1: >> + // The name __cplusplus is defined to the value 199711L when >> compiling a >> + // C++ translation unit. >> + else >> + Builder.defineMacro("__cplusplus", "199711L"); >> + >> + // C++1z [cpp.predefined]p1: >> + // An integer literal of type std::size_t whose value is the >> alignment >> + // guaranteed by a call to operator new(std::size_t) >> + // >> + // We provide this in all language modes, since it seems generally >> useful. >> + Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__", >> + Twine(TI.getNewAlign() / TI.getCharWidth()) + >> + TI.getTypeConstantSuffix(TI.getSizeType())); >> + } >> + >> + // In C11 these are environment macros. In C++11 they are only defined >> + // as part of <cuchar>. To prevent breakage when mixing C and C++ >> + // code, define these macros unconditionally. We can define them >> + // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit >> + // and 32-bit character literals. >> + Builder.defineMacro("__STDC_UTF_16__", "1"); >> + Builder.defineMacro("__STDC_UTF_32__", "1"); >> + >> + if (LangOpts.ObjC1) >> + Builder.defineMacro("__OBJC__"); >> + >> + // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and >> Macros. >> + if (LangOpts.OpenCL) { >> + // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate >> the >> + // language standard with which the program is compiled. >> __OPENCL_VERSION__ >> + // is for the OpenCL version supported by the OpenCL device, which is >> not >> + // necessarily the language standard with which the program is >> compiled. >> + // A shared OpenCL header file requires a macro to indicate the >> language >> + // standard. As a workaround, __OPENCL_C_VERSION__ is defined for >> + // OpenCL v1.0 and v1.1. >> + switch (LangOpts.OpenCLVersion) { >> + case 100: >> + Builder.defineMacro("__OPENCL_C_VERSION__", "100"); >> + break; >> + case 110: >> + Builder.defineMacro("__OPENCL_C_VERSION__", "110"); >> + break; >> + case 120: >> + Builder.defineMacro("__OPENCL_C_VERSION__", "120"); >> + break; >> + case 200: >> + Builder.defineMacro("__OPENCL_C_VERSION__", "200"); >> + break; >> + default: >> + llvm_unreachable("Unsupported OpenCL version"); >> + } >> + Builder.defineMacro("CL_VERSION_1_0", "100"); >> + Builder.defineMacro("CL_VERSION_1_1", "110"); >> + Builder.defineMacro("CL_VERSION_1_2", "120"); >> + Builder.defineMacro("CL_VERSION_2_0", "200"); >> + >> + if (TI.isLittleEndian()) >> + Builder.defineMacro("__ENDIAN_LITTLE__"); >> + >> + if (LangOpts.FastRelaxedMath) >> + Builder.defineMacro("__FAST_RELAXED_MATH__"); >> + } >> + // Not "standard" per se, but available even with the -undef flag. >> + if (LangOpts.AsmPreprocessor) >> + Builder.defineMacro("__ASSEMBLER__"); >> + if (LangOpts.CUDA) >> + Builder.defineMacro("__CUDA__"); >> +} >> + >> +/// Initialize the predefined C++ language feature test macros defined in >> +/// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test >> Recommendations". >> +static void InitializeCPlusPlusFeatureTestMacros(const LangOptions >> &LangOpts, >> + MacroBuilder &Builder) { >> + // C++98 features. >> + if (LangOpts.RTTI) >> Builder.defineMacro("__cpp_rtti", "199711"); >> if (LangOpts.CXXExceptions) >> Builder.defineMacro("__cpp_exceptions", "199711"); >> >> Modified: cfe/trunk/test/Driver/unknown-std.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/unknown-std.c?rev=320089&r1=320088&r2=320089&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Driver/unknown-std.c (original) >> +++ cfe/trunk/test/Driver/unknown-std.c Thu Dec 7 13:46:26 2017 >> @@ -1,20 +1,22 @@ >> -// This file checks output given when processing C/ObjC files. >> -// When user selects invalid language standard >> -// print out supported values with short description. >> - >> -// RUN: not %clang %s -std=foobar -c 2>&1 | FileCheck --match-full-lines >> %s >> -// RUN: not %clang -x objective-c %s -std=foobar -c 2>&1 | FileCheck >> --match-full-lines %s >> -// RUN: not %clang -x renderscript %s -std=foobar -c 2>&1 | FileCheck >> --match-full-lines %s >> - >> -// CHECK: error: invalid value 'foobar' in '-std=foobar' >> -// CHECK-NEXT: note: use 'c89', 'c90', or 'iso9899:1990' for 'ISO C 1990' >> standard >> -// CHECK-NEXT: note: use 'iso9899:199409' for 'ISO C 1990 with amendment >> 1' standard >> -// CHECK-NEXT: note: use 'gnu89' or 'gnu90' for 'ISO C 1990 with GNU >> extensions' standard >> -// CHECK-NEXT: note: use 'c99' or 'iso9899:1999' for 'ISO C 1999' >> standard >> -// CHECK-NEXT: note: use 'gnu99' for 'ISO C 1999 with GNU extensions' >> standard >> -// CHECK-NEXT: note: use 'c11' or 'iso9899:2011' for 'ISO C 2011' >> standard >> -// CHECK-NEXT: note: use 'gnu11' for 'ISO C 2011 with GNU extensions' >> standard >> - >> -// Make sure that no other output is present. >> -// CHECK-NOT: {{^.+$}} >> - >> +// This file checks output given when processing C/ObjC files. >> +// When user selects invalid language standard >> +// print out supported values with short description. >> + >> +// RUN: not %clang %s -std=foobar -c 2>&1 | FileCheck --match-full-lines >> %s >> +// RUN: not %clang -x objective-c %s -std=foobar -c 2>&1 | FileCheck >> --match-full-lines %s >> +// RUN: not %clang -x renderscript %s -std=foobar -c 2>&1 | FileCheck >> --match-full-lines %s >> + >> +// CHECK: error: invalid value 'foobar' in '-std=foobar' >> +// CHECK-NEXT: note: use 'c89', 'c90', or 'iso9899:1990' for 'ISO C 1990' >> standard >> +// CHECK-NEXT: note: use 'iso9899:199409' for 'ISO C 1990 with amendment >> 1' standard >> +// CHECK-NEXT: note: use 'gnu89' or 'gnu90' for 'ISO C 1990 with GNU >> extensions' standard >> +// CHECK-NEXT: note: use 'c99' or 'iso9899:1999' for 'ISO C 1999' >> standard >> +// CHECK-NEXT: note: use 'gnu99' for 'ISO C 1999 with GNU extensions' >> standard >> +// CHECK-NEXT: note: use 'c11' or 'iso9899:2011' for 'ISO C 2011' >> standard >> +// CHECK-NEXT: note: use 'gnu11' for 'ISO C 2011 with GNU extensions' >> standard >> +// CHECK-NEXT: note: use 'c17' or 'iso9899:2017' for 'ISO C 2017' >> standard >> +// CHECK-NEXT: note: use 'gnu17' for 'ISO C 2017 with GNU extensions' >> standard >> + >> +// Make sure that no other output is present. >> +// CHECK-NOT: {{^.+$}} >> + >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits