[clang] [CIR] Handle scalar-type element GEP in GlobalView offset computation (PR #201705)

via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 9 12:57:56 PDT 2026


================
@@ -148,11 +148,19 @@ void CIRGenBuilderTy::computeGlobalViewIndicesFromFlatOffset(
             }
             llvm_unreachable("offset was not found within the record");
           })
-          .Default([](mlir::Type otherTy) {
-            llvm_unreachable("unexpected type");
-            return otherTy; // Even though this is unreachable, we need to
-                            // return a type to satisfy the return type of the
-                            // lambda.
+          .Default([&](mlir::Type otherTy) -> mlir::Type {
----------------
adams381 wrote:

The type reaching here is an integer, not a pointer, so I added a `cir::IntType` case and restored the `llvm_unreachable` default rather than a pointer case. `applyOffset` passes the *pointee* of the GlobalViewAttr to the navigator, and the only site that hands it a non-aggregate pointee is `getAddrOfConstantStringFromLiteral`, which builds ptr-to-element (`!s8i` for `const char *`). String-literal element types are always integral (`"…"`→i8, `L"…"`→i32, `u"…"`→u16, `U"…"`→u32), and a declared array keeps its array pointee and is consumed by the `ArrayType` case, so a pointer never reaches the leaf on this path. Non-integer types still hit the unreachable.


https://github.com/llvm/llvm-project/pull/201705


More information about the cfe-commits mailing list