From: Nico Weber Date: Mon, 22 Dec 2014 18:35:03 +0000 (+0000) Subject: Disable trigraphs in microsoft mode by default. Matches cl.exe. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1589d904c9312bb547e577100f2607a933e00e87;p=clang Disable trigraphs in microsoft mode by default. Matches cl.exe. The default value of Opts.Trigraphs now no longer depends solely on the language input kind, so move the code out of setLangDefaults(). Also make sure that Opts.MSVCCompat is set before the Trigraph code runs. Related to PR21974. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224719 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 776848ba7f..f44a4fb8ae 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1207,11 +1207,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.GNUKeywords = Opts.GNUMode; Opts.CXXOperatorNames = Opts.CPlusPlus; - // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs - // is specified, or -std is set to a conforming mode. - // Trigraphs are disabled by default in c++1z onwards. - Opts.Trigraphs = !Opts.GNUMode && !Opts.CPlusPlus1z; - Opts.DollarIdents = !Opts.AsmPreprocessor; // C++14 onwards has sized global deallocation functions. @@ -1436,6 +1431,15 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, else if (Args.hasArg(OPT_fwrapv)) Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined); + Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility); + Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions); + Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt; + Opts.MSCompatibilityVersion = parseMSCVersion(Args, Diags); + + // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs + // is specified, or -std is set to a conforming mode. + // Trigraphs are disabled by default in c++1z onwards. + Opts.Trigraphs = !Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus1z; if (Args.hasArg(OPT_trigraphs)) Opts.Trigraphs = 1; @@ -1443,10 +1447,6 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, OPT_fno_dollars_in_identifiers, Opts.DollarIdents); Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); - Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility); - Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions); - Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt; - Opts.MSCompatibilityVersion = parseMSCVersion(Args, Diags); Opts.VtorDispMode = getLastArgIntValue(Args, OPT_vtordisp_mode_EQ, 1, Diags); Opts.Borland = Args.hasArg(OPT_fborland_extensions); Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); diff --git a/test/Frontend/trigraphs.cpp b/test/Frontend/trigraphs.cpp index f9c84e6dc3..4b04bcbe13 100644 --- a/test/Frontend/trigraphs.cpp +++ b/test/Frontend/trigraphs.cpp @@ -3,11 +3,13 @@ // RUN: %clang_cc1 -DSTDGNU11TRI -trigraphs -std=gnu++11 -verify -fsyntax-only %s // RUN: %clang_cc1 -DSTDCPP17 -std=c++1z -verify -fsyntax-only %s // RUN: %clang_cc1 -DSTDCPP17TRI -trigraphs -std=c++1z -verify -fsyntax-only %s +// RUN: %clang_cc1 -DMSCOMPAT -fms-compatibility -std=c++11 -verify -fsyntax-only %s void foo() { -#if defined(NOFLAGS) || defined(STDCPP11) || defined(STDGNU11TRI) || defined(STDCPP17TRI) +#if defined(NOFLAGS) || defined(STDCPP11) || defined(STDGNU11TRI) || \ + defined(STDCPP17TRI) const char c[] = "??/n"; // expected-warning{{trigraph converted to '\' character}} -#elif defined(STDGNU11) || defined(STDCPP17) +#elif defined(STDGNU11) || defined(STDCPP17) || defined(MSCOMPAT) const char c[] = "??/n"; // expected-warning{{trigraph ignored}} #else #error Not handled.