diff options
Diffstat (limited to 'clang/lib/Frontend/InitPreprocessor.cpp')
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 9a0fdb1..9b611bf 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1103,7 +1103,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI, assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far"); Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth())); - Builder.defineMacro("__BOOL_WIDTH__", Twine(TI.getBoolWidth())); + // The macro is specifying the number of bits in the width, not the number of + // bits the object requires for its in-memory representation, which is what + // getBoolWidth() will return. The bool/_Bool data type is only ever one bit + // wide. See C23 6.2.6.2p2 for the rules in C. Note that + // C++23 [basic.fundamental]p10 allows an implementation-defined value + // representation for bool; when lowering to LLVM, Clang represents bool as an + // i8 in memory but as an i1 when the value is needed, so '1' is also correct + // for C++. + Builder.defineMacro("__BOOL_WIDTH__", "1"); Builder.defineMacro("__SHRT_WIDTH__", Twine(TI.getShortWidth())); Builder.defineMacro("__INT_WIDTH__", Twine(TI.getIntWidth())); Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth())); |