r320089 - Add new language mode flags for C17.

Ahmed Bougacha via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 7 15:07:13 PST 2017


On Thu, Dec 7, 2017 at 3:05 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
> On Thu, Dec 7, 2017 at 6:00 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
>> On Thu, Dec 7, 2017 at 5:59 PM, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
>>> On Thu, Dec 7, 2017 at 2:56 PM, Richard Smith via cfe-commits
>>> <cfe-commits at 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 at 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 at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>


More information about the cfe-commits mailing list