https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/72036
See #71911 >From 20ec7adfd769b10b74f5104ee308fd9b58b44208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sat, 11 Nov 2023 18:44:13 +0100 Subject: [PATCH] [clang] Add bitint classification for __builtin_classify_type See #71911 --- clang/lib/AST/ExprConstant.cpp | 8 +++++++- clang/test/Sema/builtin-classify-type.c | 5 ++++- clang/test/SemaCXX/builtin-classify-type.cpp | 5 ++++- llvm/cmake/modules/HandleLLVMOptions.cmake | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e16fec6109e744e..2073679adf790fb 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11486,6 +11486,7 @@ bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { /// Values returned by __builtin_classify_type, chosen to match the values /// produced by GCC's builtin. +/// The values can be found in gcc/typeclass.h in the GCC repository. enum class GCCTypeClass { None = -1, Void = 0, @@ -11512,6 +11513,9 @@ enum class GCCTypeClass { // decay to pointer. (Prior to version 6 it was only used in C++ mode). // GCC reserves 15 for strings, but actually uses 5 (pointer) for string // literals. + // Lang = 16, + // OpaqueType = 17, + BitInt = 18 }; /// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way @@ -11644,11 +11648,13 @@ EvaluateBuiltinClassifyType(QualType T, const LangOptions &LangOpts) { case Type::ObjCInterface: case Type::ObjCObjectPointer: case Type::Pipe: - case Type::BitInt: // 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. return GCCTypeClass::None; + case Type::BitInt: + return GCCTypeClass::BitInt; + case Type::LValueReference: case Type::RValueReference: llvm_unreachable("invalid type for expression"); diff --git a/clang/test/Sema/builtin-classify-type.c b/clang/test/Sema/builtin-classify-type.c index a222ac8af0e32fd..9a4de34e823f231 100644 --- a/clang/test/Sema/builtin-classify-type.c +++ b/clang/test/Sema/builtin-classify-type.c @@ -11,7 +11,8 @@ enum gcc_type_class { function_type_class, method_type_class, record_type_class, union_type_class, array_type_class, string_type_class, - lang_type_class + lang_type_class, opaque_type_class, + bitint_type_class }; void foo(void) { @@ -45,6 +46,7 @@ void foo(void) { vint32_t3 vt5; typedef _BitInt(64) vint64_t3 __attribute__((vector_size(16))); vint64_t3 vt6; + _BitInt(16) bitint; _Atomic int atomic_i; _Atomic double atomic_d; @@ -70,6 +72,7 @@ void foo(void) { int a17[__builtin_classify_type(atomic_d) == real_type_class ? 1 : -1]; int a18[__builtin_classify_type(complex_i) == complex_type_class ? 1 : -1]; int a19[__builtin_classify_type(complex_d) == complex_type_class ? 1 : -1]; + int a20[__builtin_classify_type(bitint) == bitint_type_class ? 1 : -1]; } extern int (^p)(void); diff --git a/clang/test/SemaCXX/builtin-classify-type.cpp b/clang/test/SemaCXX/builtin-classify-type.cpp index ebc81425e401f11..ed5430960001002 100644 --- a/clang/test/SemaCXX/builtin-classify-type.cpp +++ b/clang/test/SemaCXX/builtin-classify-type.cpp @@ -11,7 +11,8 @@ enum gcc_type_class { function_type_class, method_type_class, record_type_class, union_type_class, array_type_class, string_type_class, - lang_type_class + lang_type_class, opaque_type_class, + bitint_type_class }; class cl { @@ -42,6 +43,7 @@ void foo() { _Atomic double atomic_d; _Complex int complex_i; _Complex double complex_d; + _BitInt(32) bitint; int a1[__builtin_classify_type(f()) == void_type_class ? 1 : -1]; int a2[__builtin_classify_type(i) == integer_type_class ? 1 : -1]; @@ -65,5 +67,6 @@ void foo() { int a20[__builtin_classify_type(atomic_d) == real_type_class ? 1 : -1]; int a21[__builtin_classify_type(complex_i) == complex_type_class ? 1 : -1]; int a22[__builtin_classify_type(complex_d) == complex_type_class ? 1 : -1]; + int a23[__builtin_classify_type(bitint) == bitint_type_class ? 1 : -1]; } diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 6a3c49edc912ded..087d96550143ee7 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -1060,7 +1060,7 @@ if (UNIX AND (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)))) - append("-fdiagnostics-color" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + append("-fdiagnostics-color=always" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() # lld doesn't print colored diagnostics when invoked from Ninja _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits