From 7615ef6fe78cd37d2fe63f9ec91b3b3252c9650a Mon Sep 17 00:00:00 2001 From: Richard Barton Date: Mon, 24 Feb 2014 18:43:28 +0000 Subject: [PATCH] Implement -fno-short-wchar git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202058 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Options.td | 2 ++ lib/Driver/Tools.cpp | 3 ++- lib/Frontend/CompilerInvocation.cpp | 2 +- test/Driver/clang_f_opts.c | 7 +++++++ test/Preprocessor/init.c | 6 ++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 1363692b10..d2192586d9 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -771,6 +771,8 @@ def fshort_enums : Flag<["-"], "fshort-enums">, Group, Flags<[CC1Option def : Flag<["-"], "freorder-blocks">, Group; def fshort_wchar : Flag<["-"], "fshort-wchar">, Group, Flags<[CC1Option]>, HelpText<"Force wchar_t to be a short unsigned int">; +def fno_short_wchar : Flag<["-"], "fno-short-wchar">, Group, Flags<[CC1Option]>, + HelpText<"Force wchar_t to be an unsigned int">; def fshow_overloads_EQ : Joined<["-"], "fshow-overloads=">, Group, Flags<[CC1Option]>, HelpText<"Which overload candidates to show when overload resolution fails: " "best|all; defaults to all">; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 06eb246260..37b351c38a 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -3575,7 +3575,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // -fshort-wchar default varies depending on platform; only // pass if specified. - if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) + if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar, + options::OPT_fno_short_wchar)) A->render(Args, CmdArgs); // -fno-pascal-strings is default, only pass non-default. diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 256b0fb6c2..4ef5cfef7c 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1333,7 +1333,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.ModulesDeclUse = Args.hasArg(OPT_fmodules_decluse); Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char); Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar); - Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); + Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, false); Opts.ShortEnums = Args.hasArg(OPT_fshort_enums); Opts.Freestanding = Args.hasArg(OPT_ffreestanding); Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c index e5d67c2203..51c10831eb 100644 --- a/test/Driver/clang_f_opts.c +++ b/test/Driver/clang_f_opts.c @@ -148,3 +148,10 @@ // RUN: -fstrength-reduce -fno-strength-reduce \ // RUN: %s 2>&1 | FileCheck --check-prefix=IGNORE %s // IGNORE-NOT: error: unknown argument + +// RUN: %clang -### -fshort-wchar -fno-short-wchar %s 2>&1 | FileCheck -check-prefix=CHECK-WCHAR1 %s +// RUN: %clang -### -fno-short-wchar -fshort-wchar %s 2>&1 | FileCheck -check-prefix=CHECK-WCHAR2 %s +// CHECK-WCHAR1: -fno-short-wchar +// CHECK-WCHAR1-NOT: -fshort-wchar +// CHECK-WCHAR2: -fshort-wchar +// CHECK-WCHAR2-NOT: -fno-short-wchar diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index e87e3adc63..4c70aec297 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -202,6 +202,12 @@ // SHORTWCHAR: #define __WCHAR_TYPE__ unsigned short // SHORTWCHAR: #define __WCHAR_WIDTH__ 16 // +// RUN: %clang_cc1 -E -dM -fno-short-wchar < /dev/null | FileCheck -check-prefix SHORTWCHAR2 %s +// +// SHORTWCHAR2: #define __SIZEOF_WCHAR_T__ 4 +// SHORTWCHAR2: #define __WCHAR_WIDTH__ 32 +// Other definitions vary from platform to platform +// // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-none-none < /dev/null | FileCheck -check-prefix AARCH64 %s // // AARCH64:#define _LP64 1 -- 2.40.0