diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index e4752bed6da8b..3df41b5f4d7d0 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -4330,9 +4330,12 @@ Node *AbstractManglingParser::parseType() { case 'h': First += 2; return make("half"); - // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) + // ::= DF16b # C++23 std::bfloat16_t + // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) case 'F': { First += 2; + if (consumeIf("16b")) + return make("std::bfloat16_t"); Node *DimensionNumber = make(parseNumber()); if (!DimensionNumber) return nullptr; diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 67b9df212ff3b..e9c74f70a094b 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -33,7 +33,7 @@ // Is long double fp128? #define LDBL_FP128 (__LDBL_MANT_DIG__ == 113) -const char *cases[][2] = { +const char* cases[][2] = { // clang-format off {"_Z1A", "A"}, {"_Z1Av", "A()"}, @@ -30245,6 +30245,8 @@ const char *cases[][2] = { {"_Z1fDSDRj", "f(_Sat unsigned _Fract)"}, {"_Z1fDSDRl", "f(_Sat long _Fract)"}, {"_Z1fDSDRm", "f(_Sat unsigned long _Fract)"}, + + {"_Z11bfloat16addDF16bDF16b", "bfloat16add(std::bfloat16_t, std::bfloat16_t)"}, // clang-format on }; diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index 7fba3fdc1abc9..b0363c1a7a786 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -4330,9 +4330,12 @@ Node *AbstractManglingParser::parseType() { case 'h': First += 2; return make("half"); - // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) + // ::= DF16b # C++23 std::bfloat16_t + // ::= DF _ # ISO/IEC TS 18661 binary floating point (N bits) case 'F': { First += 2; + if (consumeIf("16b")) + return make("std::bfloat16_t"); Node *DimensionNumber = make(parseNumber()); if (!DimensionNumber) return nullptr;