On Thu, Dec 7, 2017 at 3: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.
Oh, I missed some files. I'll take care of it. -Ahmed > 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