From 5ada7a5e9747e03e8c3725b1b4d00e2a9f448e9e Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Sun, 29 Sep 2013 07:54:52 +0000 Subject: [PATCH] Add character set related __STDC_* definitions. Clang uses UTF-16 and UTF-32 for its char16_t's and char32_t's exclusively. This means that we can define __STDC_UTF_16__ and __STDC_UTF_32__ unconditionally. While there, define __STDC_MB_MIGHT_NEQ_WC__ for FreeBSD. FreeBSD's wchar_t's don't encode characters as ISO-10646; the encoding depends on the locale used. Because the character set used might not be a superset of ASCII, we must define __STDC_MB_MIGHT_NEQ_WC__. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191631 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 5 +++++ lib/Frontend/InitPreprocessor.cpp | 8 ++++++++ test/Preprocessor/init.c | 14 ++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index f1a1454410..3ee9cd48b5 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -253,6 +253,11 @@ protected: Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); DefineStd(Builder, "unix", Opts); Builder.defineMacro("__ELF__"); + + // On FreeBSD, wchar_t contains the number of the code point as + // used by the character set of the locale. These character sets are + // not necessarily a superset of ASCII. + Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1"); } public: FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo(Triple) { diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 8703a67a6f..77cf3b38e6 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -330,6 +330,14 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__cplusplus", "199711L"); } + // In C11 these are environment macros. In C++11 they are only defined + // as part of . 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__"); diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index 38ddaa6a14..ce7ee09abe 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -49,6 +49,14 @@ // C99:#define __STRICT_ANSI__ 1 // // +// RUN: %clang_cc1 -std=c11 -E -dM < /dev/null | FileCheck -check-prefix C11 %s +// +// C11:#define __STDC_UTF_16__ 1 +// C11:#define __STDC_UTF_32__ 1 +// C11:#define __STDC_VERSION__ 201112L +// C11:#define __STRICT_ANSI__ 1 +// +// // RUN: %clang_cc1 -E -dM < /dev/null | FileCheck -check-prefix COMMON %s // // COMMON:#define __CONSTANT_CFSTRINGS__ 1 @@ -2925,6 +2933,12 @@ // X86_64-LINUX:#define __x86_64 1 // X86_64-LINUX:#define __x86_64__ 1 // +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=x86_64-unknown-freebsd9.1 < /dev/null | FileCheck -check-prefix X86_64-FREEBSD %s +// +// X86_64-FREEBSD:#define __FreeBSD__ 9 +// X86_64-FREEBSD:#define __FreeBSD_cc_version 900001 +// X86_64-FREEBSD:#define __STDC_MB_MIGHT_NEQ_WC__ 1 +// // RUN: %clang_cc1 -E -dM -ffreestanding -triple=sparc64-none-none < /dev/null | FileCheck -check-prefix SPARCV9 %s // SPARCV9:#define __INT64_TYPE__ long int // SPARCV9:#define __INTMAX_TYPE__ long int -- 2.40.0