diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ea1d8ac7e66a1..06c7d57d73ca7 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -135,11 +135,6 @@ C23 Feature Support Fixes (`#81472 `_). -- Clang now generates predefined macros of the form ``__TYPE_FMTB__`` and - ``__TYPE_FMTb__`` (e.g., ``__UINT_FAST64_FMTB__``) in C23 mode for use with - macros typically exposed from ````, such as ``PRIb8``. - (`#81896: `_). - Non-comprehensive list of changes in this release ------------------------------------------------- diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 9b979d810fa12..1b250cda42a4d 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -181,21 +181,14 @@ static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty, TI.isTypeSigned(Ty), Builder); } -static void DefineFmt(const LangOptions &LangOpts, const Twine &Prefix, - TargetInfo::IntType Ty, const TargetInfo &TI, - MacroBuilder &Builder) { - StringRef FmtModifier = TI.getTypeFormatModifier(Ty); - auto Emitter = [&](char Fmt) { - Builder.defineMacro(Prefix + "_FMT" + Twine(Fmt) + "__", - Twine("\"") + FmtModifier + Twine(Fmt) + "\""); - }; +static void DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty, + const TargetInfo &TI, MacroBuilder &Builder) { bool IsSigned = TI.isTypeSigned(Ty); - llvm::for_each(StringRef(IsSigned ? "di" : "ouxX"), Emitter); - - // C23 added the b and B modifiers for printing binary output of unsigned - // integers. Conditionally define those if compiling in C23 mode. - if (LangOpts.C23 && !IsSigned) - llvm::for_each(StringRef("bB"), Emitter); + StringRef FmtModifier = TI.getTypeFormatModifier(Ty); + for (const char *Fmt = IsSigned ? "di" : "ouxX"; *Fmt; ++Fmt) { + Builder.defineMacro(Prefix + "_FMT" + Twine(*Fmt) + "__", + Twine("\"") + FmtModifier + Twine(*Fmt) + "\""); + } } static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, @@ -224,8 +217,7 @@ static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty, DefineTypeWidth(Prefix + "_WIDTH__", Ty, TI, Builder); } -static void DefineExactWidthIntType(const LangOptions &LangOpts, - TargetInfo::IntType Ty, +static void DefineExactWidthIntType(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder) { int TypeWidth = TI.getTypeWidth(Ty); @@ -244,7 +236,7 @@ static void DefineExactWidthIntType(const LangOptions &LangOpts, const char *Prefix = IsSigned ? "__INT" : "__UINT"; DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); - DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); + DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty)); Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix); @@ -267,8 +259,7 @@ static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); } -static void DefineLeastWidthIntType(const LangOptions &LangOpts, - unsigned TypeWidth, bool IsSigned, +static void DefineLeastWidthIntType(unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder) { TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned); @@ -283,12 +274,11 @@ static void DefineLeastWidthIntType(const LangOptions &LangOpts, DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder); else DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); - DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); + DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); } -static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, - bool IsSigned, const TargetInfo &TI, - MacroBuilder &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); @@ -303,7 +293,7 @@ static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder); else DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); - DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); + DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); } @@ -1130,20 +1120,19 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder); DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder); - DefineFmt(LangOpts, "__INTMAX", TI.getIntMaxType(), TI, Builder); + DefineFmt("__INTMAX", TI.getIntMaxType(), TI, Builder); Builder.defineMacro("__INTMAX_C_SUFFIX__", TI.getTypeConstantSuffix(TI.getIntMaxType())); DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder); - DefineFmt(LangOpts, "__UINTMAX", TI.getUIntMaxType(), TI, Builder); + DefineFmt("__UINTMAX", TI.getUIntMaxType(), TI, Builder); Builder.defineMacro("__UINTMAX_C_SUFFIX__", TI.getTypeConstantSuffix(TI.getUIntMaxType())); DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder); - DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, - Builder); + DefineFmt("__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, Builder); DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder); - DefineFmt(LangOpts, "__INTPTR", TI.getIntPtrType(), TI, Builder); + DefineFmt("__INTPTR", TI.getIntPtrType(), TI, Builder); DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder); - DefineFmt(LangOpts, "__SIZE", TI.getSizeType(), TI, Builder); + DefineFmt("__SIZE", TI.getSizeType(), TI, Builder); DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder); DefineType("__WINT_TYPE__", TI.getWIntType(), Builder); DefineTypeSizeAndWidth("__SIG_ATOMIC", TI.getSigAtomicType(), TI, Builder); @@ -1151,7 +1140,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder); DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder); - DefineFmt(LangOpts, "__UINTPTR", TI.getUIntPtrType(), TI, Builder); + DefineFmt("__UINTPTR", TI.getUIntPtrType(), TI, Builder); // The C standard requires the width of uintptr_t and intptr_t to be the same, // per 7.20.2.4p1. Same for intmax_t and uintmax_t, per 7.20.2.5p1. @@ -1227,66 +1216,65 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__WINT_UNSIGNED__"); // Define exact-width integer types for stdint.h - DefineExactWidthIntType(LangOpts, TargetInfo::SignedChar, TI, Builder); + DefineExactWidthIntType(TargetInfo::SignedChar, TI, Builder); if (TI.getShortWidth() > TI.getCharWidth()) - DefineExactWidthIntType(LangOpts, TargetInfo::SignedShort, TI, Builder); + DefineExactWidthIntType(TargetInfo::SignedShort, TI, Builder); if (TI.getIntWidth() > TI.getShortWidth()) - DefineExactWidthIntType(LangOpts, TargetInfo::SignedInt, TI, Builder); + DefineExactWidthIntType(TargetInfo::SignedInt, TI, Builder); if (TI.getLongWidth() > TI.getIntWidth()) - DefineExactWidthIntType(LangOpts, TargetInfo::SignedLong, TI, Builder); + DefineExactWidthIntType(TargetInfo::SignedLong, TI, Builder); if (TI.getLongLongWidth() > TI.getLongWidth()) - DefineExactWidthIntType(LangOpts, TargetInfo::SignedLongLong, TI, Builder); + DefineExactWidthIntType(TargetInfo::SignedLongLong, TI, Builder); - DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedChar, TI, Builder); + DefineExactWidthIntType(TargetInfo::UnsignedChar, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::UnsignedChar, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::SignedChar, TI, Builder); if (TI.getShortWidth() > TI.getCharWidth()) { - DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedShort, TI, Builder); + DefineExactWidthIntType(TargetInfo::UnsignedShort, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::UnsignedShort, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::SignedShort, TI, Builder); } if (TI.getIntWidth() > TI.getShortWidth()) { - DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedInt, TI, Builder); + DefineExactWidthIntType(TargetInfo::UnsignedInt, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::UnsignedInt, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::SignedInt, TI, Builder); } if (TI.getLongWidth() > TI.getIntWidth()) { - DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLong, TI, Builder); + DefineExactWidthIntType(TargetInfo::UnsignedLong, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::UnsignedLong, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::SignedLong, TI, Builder); } if (TI.getLongLongWidth() > TI.getLongWidth()) { - DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLongLong, TI, - Builder); + DefineExactWidthIntType(TargetInfo::UnsignedLongLong, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::UnsignedLongLong, TI, Builder); DefineExactWidthIntTypeSize(TargetInfo::SignedLongLong, TI, Builder); } - DefineLeastWidthIntType(LangOpts, 8, true, TI, Builder); - DefineLeastWidthIntType(LangOpts, 8, false, TI, Builder); - DefineLeastWidthIntType(LangOpts, 16, true, TI, Builder); - DefineLeastWidthIntType(LangOpts, 16, false, TI, Builder); - DefineLeastWidthIntType(LangOpts, 32, true, TI, Builder); - DefineLeastWidthIntType(LangOpts, 32, false, TI, Builder); - DefineLeastWidthIntType(LangOpts, 64, true, TI, Builder); - DefineLeastWidthIntType(LangOpts, 64, false, TI, Builder); - - DefineFastIntType(LangOpts, 8, true, TI, Builder); - DefineFastIntType(LangOpts, 8, false, TI, Builder); - DefineFastIntType(LangOpts, 16, true, TI, Builder); - DefineFastIntType(LangOpts, 16, false, TI, Builder); - DefineFastIntType(LangOpts, 32, true, TI, Builder); - DefineFastIntType(LangOpts, 32, false, TI, Builder); - DefineFastIntType(LangOpts, 64, true, TI, Builder); - DefineFastIntType(LangOpts, 64, false, TI, Builder); + DefineLeastWidthIntType(8, true, TI, Builder); + DefineLeastWidthIntType(8, false, TI, Builder); + DefineLeastWidthIntType(16, true, TI, Builder); + DefineLeastWidthIntType(16, false, TI, Builder); + DefineLeastWidthIntType(32, true, TI, Builder); + DefineLeastWidthIntType(32, false, TI, Builder); + DefineLeastWidthIntType(64, true, TI, Builder); + DefineLeastWidthIntType(64, false, TI, Builder); + + DefineFastIntType(8, true, TI, Builder); + DefineFastIntType(8, false, TI, Builder); + DefineFastIntType(16, true, TI, Builder); + DefineFastIntType(16, false, TI, Builder); + DefineFastIntType(32, true, TI, Builder); + DefineFastIntType(32, false, TI, Builder); + DefineFastIntType(64, true, TI, Builder); + DefineFastIntType(64, false, TI, Builder); Builder.defineMacro("__USER_LABEL_PREFIX__", TI.getUserLabelPrefix()); diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c index e4c3f51c1b04a..c3dbd94b2f741 100644 --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -93,70 +93,6 @@ // C99-NOT: __GXX_WEAK__ // C99-NOT: __cplusplus // -// RUN: %clang_cc1 -std=c17 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix C17-FMT %s -// RUN: %clang_cc1 -std=c23 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix C23-FMT %s -// -// C17-FMT-NOT: __SIZE_FMTB__ -// C17-FMT-NOT: __SIZE_FMTb__ -// C17-FMT-NOT: __UINT8_FMTB__ -// C17-FMT-NOT: __UINT8_FMTb__ -// C17-FMT-NOT: __UINT16_FMTB__ -// C17-FMT-NOT: __UINT16_FMTb__ -// C17-FMT-NOT: __UINT32_FMTB__ -// C17-FMT-NOT: __UINT32_FMTb__ -// C17-FMT-NOT: __UINT64_FMTB__ -// C17-FMT-NOT: __UINT64_FMTb__ -// C17-FMT-NOT: __UINTMAX_FMTB__ -// C17-FMT-NOT: __UINTMAX_FMTb__ -// C17-FMT-NOT: __UINTPTR_FMTB__ -// C17-FMT-NOT: __UINTPTR_FMTb__ -// C17-FMT-NOT: __UINT_FAST16_FMTB__ -// C17-FMT-NOT: __UINT_FAST16_FMTb__ -// C17-FMT-NOT: __UINT_FAST32_FMTB__ -// C17-FMT-NOT: __UINT_FAST32_FMTb__ -// C17-FMT-NOT: __UINT_FAST64_FMTB__ -// C17-FMT-NOT: __UINT_FAST64_FMTb__ -// C17-FMT-NOT: __UINT_FAST8_FMTB__ -// C17-FMT-NOT: __UINT_FAST8_FMTb__ -// C17-FMT-NOT: __UINT_LEAST16_FMTB__ -// C17-FMT-NOT: __UINT_LEAST16_FMTb__ -// C17-FMT-NOT: __UINT_LEAST32_FMTB__ -// C17-FMT-NOT: __UINT_LEAST32_FMTb__ -// C17-FMT-NOT: __UINT_LEAST64_FMTB__ -// C17-FMT-NOT: __UINT_LEAST64_FMTb__ -// C17-FMT-NOT: __UINT_LEAST8_FMTB__ -// C17-FMT-NOT: __UINT_LEAST8_FMTb__ -// C23-FMT: #define __SIZE_FMTB__ "llB" -// C23-FMT: #define __SIZE_FMTb__ "llb" -// C23-FMT: #define __UINT16_FMTB__ "hB" -// C23-FMT: #define __UINT16_FMTb__ "hb" -// C23-FMT: #define __UINT32_FMTB__ "B" -// C23-FMT: #define __UINT32_FMTb__ "b" -// C23-FMT: #define __UINT64_FMTB__ "llB" -// C23-FMT: #define __UINT64_FMTb__ "llb" -// C23-FMT: #define __UINT8_FMTB__ "hhB" -// C23-FMT: #define __UINT8_FMTb__ "hhb" -// C23-FMT: #define __UINTMAX_FMTB__ "llB" -// C23-FMT: #define __UINTMAX_FMTb__ "llb" -// C23-FMT: #define __UINTPTR_FMTB__ "llB" -// C23-FMT: #define __UINTPTR_FMTb__ "llb" -// C23-FMT: #define __UINT_FAST16_FMTB__ "hB" -// C23-FMT: #define __UINT_FAST16_FMTb__ "hb" -// C23-FMT: #define __UINT_FAST32_FMTB__ "B" -// C23-FMT: #define __UINT_FAST32_FMTb__ "b" -// C23-FMT: #define __UINT_FAST64_FMTB__ "llB" -// C23-FMT: #define __UINT_FAST64_FMTb__ "llb" -// C23-FMT: #define __UINT_FAST8_FMTB__ "hhB" -// C23-FMT: #define __UINT_FAST8_FMTb__ "hhb" -// C23-FMT: #define __UINT_LEAST16_FMTB__ "hB" -// C23-FMT: #define __UINT_LEAST16_FMTb__ "hb" -// C23-FMT: #define __UINT_LEAST32_FMTB__ "B" -// C23-FMT: #define __UINT_LEAST32_FMTb__ "b" -// C23-FMT: #define __UINT_LEAST64_FMTB__ "llB" -// C23-FMT: #define __UINT_LEAST64_FMTb__ "llb" -// C23-FMT: #define __UINT_LEAST8_FMTB__ "hhB" -// C23-FMT: #define __UINT_LEAST8_FMTb__ "hhb" -// // // RUN: %clang_cc1 -std=c11 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix C11 %s // RUN: %clang_cc1 -std=c1x -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix C11 %s