[clang] a79a561 - [clang] Classify vector types in __builtin_classify_type (#73299)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 24 05:41:03 PST 2023
Author: Timm Baeder
Date: 2023-11-24T14:40:58+01:00
New Revision: a79a5611bd18baab02ea6ad31f7b6b767f4028a7
URL: https://github.com/llvm/llvm-project/commit/a79a5611bd18baab02ea6ad31f7b6b767f4028a7
DIFF: https://github.com/llvm/llvm-project/commit/a79a5611bd18baab02ea6ad31f7b6b767f4028a7.diff
LOG: [clang] Classify vector types in __builtin_classify_type (#73299)
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/ExprConstShared.h
clang/lib/AST/ExprConstant.cpp
clang/test/Sema/builtin-classify-type.c
clang/test/SemaCXX/builtin-classify-type.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7e2c990d03e7f27..362ce410356719b 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 53ec9c6c7a3ef2e..a97eac85abc69e9 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 3a41e9718bb5875..16697e5f076a8f8 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<AtomicType>()->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 50f517fcbc852a2..21b212faeedcd81 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 651dc8b24bf9483..6bae9cd6b1dc0dd 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];
More information about the cfe-commits
mailing list