diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7e2c990d03e7f..362ce41035671 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -225,8 +225,8 @@ Non-comprehensive list of changes in this release determined at runtime. * The ``__datasizeof`` keyword has been added. It is similar to ``sizeof`` except that it returns the size of a type ignoring tail padding. -* ``__builtin_classify_type()`` now classifies ``_BitInt`` values as the return value ``18``, - to match GCC 14's behavior. +* ``__builtin_classify_type()`` now classifies ``_BitInt`` values as the return value ``18`` + and vector types as return value ``19``, to match GCC 14's behavior. New Compiler Flags ------------------ diff --git a/clang/lib/AST/ExprConstShared.h b/clang/lib/AST/ExprConstShared.h index 53ec9c6c7a3ef..a97eac85abc69 100644 --- a/clang/lib/AST/ExprConstShared.h +++ b/clang/lib/AST/ExprConstShared.h @@ -49,7 +49,8 @@ enum class GCCTypeClass { // literals. // Lang = 16, // OpaqueType = 17, - BitInt = 18 + BitInt = 18, + Vector = 19 }; GCCTypeClass EvaluateBuiltinClassifyType(QualType T, diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 3a41e9718bb58..16697e5f076a8 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11615,16 +11615,18 @@ GCCTypeClass EvaluateBuiltinClassifyType(QualType T, return EvaluateBuiltinClassifyType( CanTy->castAs()->getValueType(), LangOpts); - case Type::BlockPointer: case Type::Vector: case Type::ExtVector: + return GCCTypeClass::Vector; + + case Type::BlockPointer: case Type::ConstantMatrix: case Type::ObjCObject: case Type::ObjCInterface: case Type::ObjCObjectPointer: case Type::Pipe: - // GCC classifies vectors as None. We follow its lead and classify all - // other types that don't fit into the regular classification the same way. + // Classify all other types that don't fit into the regular + // classification the same way. return GCCTypeClass::None; case Type::BitInt: diff --git a/clang/test/Sema/builtin-classify-type.c b/clang/test/Sema/builtin-classify-type.c index 50f517fcbc852..21b212faeedcd 100644 --- a/clang/test/Sema/builtin-classify-type.c +++ b/clang/test/Sema/builtin-classify-type.c @@ -13,7 +13,7 @@ enum gcc_type_class { record_type_class, union_type_class, array_type_class, string_type_class, lang_type_class, opaque_type_class, - bitint_type_class + bitint_type_class, vector_type_class }; void foo(void) { @@ -67,8 +67,8 @@ void foo(void) { int a11[__builtin_classify_type(arr) == pointer_type_class ? 1 : -1]; int a12[__builtin_classify_type("abc") == pointer_type_class ? 1 : -1]; int a13[__builtin_classify_type(block) == no_type_class ? 1 : -1]; - int a14[__builtin_classify_type(vec) == no_type_class ? 1 : -1]; - int a15[__builtin_classify_type(evec) == no_type_class ? 1 : -1]; + int a14[__builtin_classify_type(vec) == vector_type_class ? 1 : -1]; + int a15[__builtin_classify_type(evec) == vector_type_class ? 1 : -1]; int a16[__builtin_classify_type(atomic_i) == integer_type_class ? 1 : -1]; int a17[__builtin_classify_type(atomic_d) == real_type_class ? 1 : -1]; int a18[__builtin_classify_type(complex_i) == complex_type_class ? 1 : -1]; diff --git a/clang/test/SemaCXX/builtin-classify-type.cpp b/clang/test/SemaCXX/builtin-classify-type.cpp index 651dc8b24bf94..6bae9cd6b1dc0 100644 --- a/clang/test/SemaCXX/builtin-classify-type.cpp +++ b/clang/test/SemaCXX/builtin-classify-type.cpp @@ -13,7 +13,7 @@ enum gcc_type_class { record_type_class, union_type_class, array_type_class, string_type_class, lang_type_class, opaque_type_class, - bitint_type_class + bitint_type_class, vector_type_class }; class cl { @@ -62,8 +62,8 @@ void foo() { int a14[__builtin_classify_type(arr) == pointer_type_class ? 1 : -1]; int a15[__builtin_classify_type("abc") == pointer_type_class ? 1 : -1]; int a16[__builtin_classify_type(block) == no_type_class ? 1 : -1]; - int a17[__builtin_classify_type(vec) == no_type_class ? 1 : -1]; - int a18[__builtin_classify_type(evec) == no_type_class ? 1 : -1]; + int a17[__builtin_classify_type(vec) == vector_type_class ? 1 : -1]; + int a18[__builtin_classify_type(evec) == vector_type_class ? 1 : -1]; int a19[__builtin_classify_type(atomic_i) == integer_type_class ? 1 : -1]; int a20[__builtin_classify_type(atomic_d) == real_type_class ? 1 : -1]; int a21[__builtin_classify_type(complex_i) == complex_type_class ? 1 : -1];