On Thu, Dec 7, 2017 at 3:05 PM, Aaron Ballman <aa...@aaronballman.com> wrote: > On Thu, Dec 7, 2017 at 6:00 PM, Aaron Ballman <aa...@aaronballman.com> wrote: >> 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! > > I corrected the rest of the line endings in r320113.
Thanks! -Ahmed > ~Aaron > >> >> ~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