On Thu, Dec 7, 2017 at 5:59 PM, Ahmed Bougacha <ahmed.bouga...@gmail.com> wrote: > 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.
Thanks, I was just getting on that. Sorry about the inadvertent churn there! ~Aaron > > -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