[clang] b6d9ca1 - Do not crash when trying to encode a _BitInt type

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 28 05:38:10 PST 2022


Author: Aaron Ballman
Date: 2022-01-28T08:38:01-05:00
New Revision: b6d9ca14c20f6f982a9fee4bebccf4761400f6aa

URL: https://github.com/llvm/llvm-project/commit/b6d9ca14c20f6f982a9fee4bebccf4761400f6aa
DIFF: https://github.com/llvm/llvm-project/commit/b6d9ca14c20f6f982a9fee4bebccf4761400f6aa.diff

LOG: Do not crash when trying to encode a _BitInt type

Using a _BitInt (or _ExtInt) type as a block parameter or block return
type hits an "unreachable" when trying to determine the encoding for
the block. Instead of crashing, this patch handles it like some of the
other types for which we don't yet have an encoding. The test case
verifies we no longer crash, but does not verify that we provide any
particular encoding (it can be updated once someone more familiar with
ObjC steps in to define the encoding).

Fixes PR50503.

Added: 
    clang/test/CodeGenObjC/encode-test-bitint.m

Modified: 
    clang/lib/AST/ASTContext.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 153c89319161e..139ea5ee47329 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -8290,6 +8290,11 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
       *NotEncodedT = T;
     return;
 
+  case Type::BitInt:
+    if (NotEncodedT)
+      *NotEncodedT = T;
+    return;
+
   // We could see an undeduced auto type here during error recovery.
   // Just ignore it.
   case Type::Auto:
@@ -8297,7 +8302,6 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
     return;
 
   case Type::Pipe:
-  case Type::BitInt:
 #define ABSTRACT_TYPE(KIND, BASE)
 #define TYPE(KIND, BASE)
 #define DEPENDENT_TYPE(KIND, BASE) \

diff  --git a/clang/test/CodeGenObjC/encode-test-bitint.m b/clang/test/CodeGenObjC/encode-test-bitint.m
new file mode 100644
index 0000000000000..5f58ffe24f704
--- /dev/null
+++ b/clang/test/CodeGenObjC/encode-test-bitint.m
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -triple i686-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -fblocks -emit-llvm -o /dev/null %s
+
+// Using a _BitInt as a block parameter or return type previously would crash
+// when getting the ObjC encoding for the type. Verify that we no longer crash,
+// but do not verify any particular encoding (one has not yet been determined).
+void foo1(void)
+{
+    __auto_type blk = ^int(unsigned _BitInt(64) len)
+    {
+        return 12;
+    };
+}
+
+void foo2(void)
+{
+    __auto_type blk = ^unsigned _BitInt(64)(int len)
+    {
+        return 12;
+    };
+}
+


        


More information about the cfe-commits mailing list