Author: Akimasa Watanuki
Date: 2026-10-20T16:50:48-05:00
New Revision: 6d95d08def2b1a929b65fa5fac17ddee26822f72

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

LOG: [CIR] Propagate type conversion failures in DirectToLLVM (#224237)

Propagate failed type and constant conversions through DirectToLLVM so
unsupported types produce legalization failures instead of invalid LLVM
operations or a void function result.

Assisted-by: Codex / GPT-6

Added: 
    clang/test/CIR/Lowering/unsupported-type-conversions.cir

Modified: 
    clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
    clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index ac005a4e838d1..541d4de60a337 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -29,6 +29,7 @@
 #include "mlir/IR/BuiltinAttributes.h"
 #include "mlir/IR/BuiltinDialect.h"
 #include "mlir/IR/BuiltinOps.h"
+#include "mlir/IR/Diagnostics.h"
 #include "mlir/IR/Location.h"
 #include "mlir/IR/Types.h"
 #include "mlir/Pass/Pass.h"
@@ -81,6 +82,11 @@ mlir::Type elementTypeIfVectorOrMatrix(mlir::Type type) {
 }
 } // namespace
 
+static mlir::InFlightDiagnostic emitTypeConversionError(mlir::Operation *op,
+                                                        mlir::Type type) {
+  return op->emitError() << "ClangIR lowering NYI: cannot convert " << type;
+}
+
 /// Alignment to use for a memory access whose op carries no explicit 
alignment.
 /// For _BitInt the storage integer iM's ABI alignment (e.g. i128's 16)
 /// over-aligns the value, so use the CIR _BitInt ABI alignment (e.g. 8).
@@ -483,6 +489,7 @@ class CIRAttrToValue {
   struct LoweredGlobalSymbol {
     mlir::Value addr;
     mlir::Type sourceType;
+    mlir::Type originalType;
     unsigned addrSpace;
   };
 
@@ -508,10 +515,7 @@ mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp,
                                 LLVMBlockAddressInfo *blockInfoAddr) {
   CIRAttrToValue valueConverter(parentOp, rewriter, symbolTables, converter,
                                 blockInfoAddr);
-  mlir::Value value = valueConverter.visit(attr);
-  if (!value)
-    llvm_unreachable("unhandled attribute type");
-  return value;
+  return valueConverter.visit(attr);
 }
 
 static mlir::LLVM::ModRefInfo convertModRefInfo(cir::ModRefInfo info) {
@@ -950,11 +954,16 @@ mlir::Value 
CIRAttrToValue::visitCirAttr(cir::ConstArrayAttr attr) {
       auto prefix = cir::ConstArrayAttr::get(
           cir::ArrayType::get(arrayTy.getElementType(), arrayAttr.size()),
           arrayAttr);
-      return mlir::LLVM::InsertValueOp::create(rewriter, loc, result,
-                                               visit(prefix), int64_t{0});
+      mlir::Value init = visit(prefix);
+      if (!init)
+        return {};
+      return mlir::LLVM::InsertValueOp::create(rewriter, loc, result, init,
+                                               int64_t{0});
     }
     for (auto [idx, elt] : llvm::enumerate(arrayAttr)) {
       mlir::Value init = visit(elt);
+      if (!init)
+        return {};
       result =
           mlir::LLVM::InsertValueOp::create(rewriter, loc, result, init, idx);
     }
@@ -999,8 +1008,11 @@ mlir::Value 
CIRAttrToValue::visitCirAttr(cir::ConstRecordAttr constRecord) {
       ++paddingItr;
     }
 
-    result = mlir::LLVM::InsertValueOp::create(rewriter, loc, result,
-                                               visit(elt), insertIdx);
+    mlir::Value init = visit(elt);
+    if (!init)
+      return {};
+    result = mlir::LLVM::InsertValueOp::create(rewriter, loc, result, init,
+                                               insertIdx);
     ++insertIdx;
   }
 
@@ -1043,6 +1055,7 @@ 
CIRAttrToValue::getAddressOfSymbol(mlir::FlatSymbolRefAttr symbol) {
   cir::CIRDataLayout cirDataLayout(moduleOp);
   const mlir::DataLayout &dataLayout = cirDataLayout.layout;
   mlir::Type sourceType;
+  mlir::Type originalType;
   unsigned addrSpace = 0;
   llvm::StringRef symName;
   mlir::Operation *sourceSymbol = symbolTables.lookupSymbolIn(moduleOp, 
symbol);
@@ -1051,8 +1064,8 @@ 
CIRAttrToValue::getAddressOfSymbol(mlir::FlatSymbolRefAttr symbol) {
     symName = llvmSymbol.getSymName();
     addrSpace = llvmSymbol.getAddrSpace();
   } else if (auto cirSymbol = dyn_cast<cir::GlobalOp>(sourceSymbol)) {
-    sourceType =
-        convertTypeForMemory(*converter, dataLayout, cirSymbol.getSymType());
+    originalType = cirSymbol.getSymType();
+    sourceType = convertTypeForMemory(*converter, dataLayout, originalType);
     symName = cirSymbol.getSymName();
     if (auto targetAS = mlir::dyn_cast_if_present<cir::TargetAddressSpaceAttr>(
             cirSymbol.getAddrSpaceAttr()))
@@ -1062,7 +1075,8 @@ 
CIRAttrToValue::getAddressOfSymbol(mlir::FlatSymbolRefAttr symbol) {
     symName = llvmFun.getSymName();
     addrSpace = cirDataLayout.getProgramAddressSpace();
   } else if (auto fun = dyn_cast<cir::FuncOp>(sourceSymbol)) {
-    sourceType = converter->convertType(fun.getFunctionType());
+    originalType = fun.getFunctionType();
+    sourceType = converter->convertType(originalType);
     symName = fun.getSymName();
     addrSpace = cirDataLayout.getProgramAddressSpace();
   } else if (auto alias = dyn_cast<mlir::LLVM::AliasOp>(sourceSymbol)) {
@@ -1077,7 +1091,7 @@ 
CIRAttrToValue::getAddressOfSymbol(mlir::FlatSymbolRefAttr symbol) {
       rewriter, loc,
       mlir::LLVM::LLVMPointerType::get(rewriter.getContext(), addrSpace),
       symName);
-  return {addr, sourceType, addrSpace};
+  return {addr, sourceType, originalType, addrSpace};
 }
 
 mlir::Value CIRAttrToValue::castGlobalAddrToType(mlir::Value addr,
@@ -1132,6 +1146,11 @@ mlir::Value 
CIRAttrToValue::visitCirAttr(cir::GlobalViewAttr globalAttr) {
   mlir::Type sourceType = lowered.sourceType;
 
   if (globalAttr.getIndices()) {
+    if (!sourceType) {
+      emitTypeConversionError(parentOp, lowered.originalType)
+          << " for symbol " << globalAttr.getSymbol();
+      return {};
+    }
     llvm::SmallVector<mlir::LLVM::GEPArg> indices;
 
     if (mlir::isa<mlir::LLVM::LLVMArrayType, mlir::LLVM::LLVMStructType>(
@@ -1200,6 +1219,8 @@ mlir::Value 
CIRAttrToValue::visitCirAttr(cir::TypeInfoAttr typeInfoAttr) {
 
   for (auto [idx, elt] : llvm::enumerate(typeInfoAttr.getData())) {
     mlir::Value init = visit(elt);
+    if (!init)
+      return {};
     result =
         mlir::LLVM::InsertValueOp::create(rewriter, loc, result, init, idx);
   }
@@ -1233,6 +1254,8 @@ mlir::Value CIRAttrToValue::visitCirAttr(cir::VTableAttr 
vtableArr) {
 
   for (auto [idx, elt] : llvm::enumerate(vtableArr.getData())) {
     mlir::Value init = visit(elt);
+    if (!init)
+      return {};
     result =
         mlir::LLVM::InsertValueOp::create(rewriter, loc, result, init, idx);
   }
@@ -1895,6 +1918,9 @@ mlir::LogicalResult 
CIRToLLVMCastOpLowering::matchAndRewrite(
   // both individual scalars and entire vectors. This lowering pass handles
   // both situations.
 
+  if (!getTypeConverter()->convertType(castOp.getType()))
+    return emitTypeConversionError(castOp, castOp.getType());
+
   switch (castOp.getKind()) {
   case cir::CastKind::array_to_ptrdecay: {
     const auto ptrTy = mlir::cast<cir::PointerType>(castOp.getType());
@@ -2752,6 +2778,8 @@ mlir::LogicalResult 
CIRToLLVMConstantOpLowering::matchAndRewrite(
     cir::ConstantOp op, OpAdaptor adaptor,
     mlir::ConversionPatternRewriter &rewriter) const {
   mlir::Attribute attr = op.getValue();
+  if (!getTypeConverter()->convertType(op.getType()))
+    return emitTypeConversionError(op, op.getType());
 
   if (mlir::isa<cir::PoisonAttr>(attr)) {
     rewriter.replaceOpWithNewOp<mlir::LLVM::PoisonOp>(
@@ -2810,6 +2838,8 @@ mlir::LogicalResult 
CIRToLLVMConstantOpLowering::matchAndRewrite(
       auto newOp =
           lowerCirAttrAsValue(op, op.getValue(), rewriter, symbolTables,
                               getTypeConverter(), &blockInfoAddr);
+      if (!newOp)
+        return mlir::failure();
       rewriter.replaceOp(op, newOp);
       return mlir::success();
     }
@@ -2828,6 +2858,8 @@ mlir::LogicalResult 
CIRToLLVMConstantOpLowering::matchAndRewrite(
     } else {
       const mlir::Value initVal =
           lowerCirAttrAsValue(op, value, rewriter, symbolTables, 
typeConverter);
+      if (!initVal)
+        return mlir::failure();
       rewriter.replaceOp(op, initVal);
       return mlir::success();
     }
@@ -2836,17 +2868,23 @@ mlir::LogicalResult 
CIRToLLVMConstantOpLowering::matchAndRewrite(
     auto initVal =
         lowerCirAttrAsValue(op, spellOutSplitTrailingZeros(recordAttr),
                             rewriter, symbolTables, typeConverter);
+    if (!initVal)
+      return mlir::failure();
     rewriter.replaceOp(op, initVal);
     return mlir::success();
   } else if (const auto vecTy = mlir::dyn_cast<cir::VectorType>(op.getType())) 
{
-    rewriter.replaceOp(op,
-                       lowerCirAttrAsValue(op, op.getValue(), rewriter,
-                                           symbolTables, getTypeConverter()));
+    mlir::Value initVal = lowerCirAttrAsValue(op, op.getValue(), rewriter,
+                                              symbolTables, 
getTypeConverter());
+    if (!initVal)
+      return mlir::failure();
+    rewriter.replaceOp(op, initVal);
     return mlir::success();
   } else if (mlir::isa<cir::RecordType>(op.getType())) {
     if (mlir::isa<cir::ZeroAttr, cir::UndefAttr>(attr)) {
       mlir::Value initVal =
           lowerCirAttrAsValue(op, attr, rewriter, symbolTables, typeConverter);
+      if (!initVal)
+        return mlir::failure();
       rewriter.replaceOp(op, initVal);
       return mlir::success();
     }
@@ -3079,17 +3117,18 @@ mlir::LogicalResult 
CIRToLLVMFuncOpLowering::matchAndRewrite(
   for (const auto &argType : llvm::enumerate(fnType.getInputs())) {
     mlir::Type convertedType = typeConverter->convertType(argType.value());
     if (!convertedType)
-      return mlir::failure();
+      return emitTypeConversionError(op, argType.value());
     signatureConversion.addInputs(argType.index(), convertedType);
   }
 
   mlir::Type resultType =
       getTypeConverter()->convertType(fnType.getReturnType());
+  if (!resultType)
+    return emitTypeConversionError(op, fnType.getReturnType());
 
   // Create the LLVM function operation.
   mlir::Type llvmFnTy = mlir::LLVM::LLVMFunctionType::get(
-      resultType ? resultType : mlir::LLVM::LLVMVoidType::get(getContext()),
-      signatureConversion.getConvertedTypes(),
+      resultType, signatureConversion.getConvertedTypes(),
       /*isVarArg=*/fnType.isVarArg());
 
   // If this is an alias, it needs to be lowered to llvm::AliasOp.
@@ -3323,6 +3362,8 @@ 
CIRToLLVMGlobalOpLowering::matchAndRewriteRegionInitializedGlobal(
   CIRAttrToValue valueConverter(op, rewriter, symbolTables, typeConverter,
                                 &blockInfoAddr);
   mlir::Value value = valueConverter.visit(init);
+  if (!value)
+    return mlir::failure();
   mlir::LLVM::ReturnOp::create(rewriter, loc, value);
   return mlir::success();
 }
@@ -4321,6 +4362,8 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter 
&converter,
   });
   converter.addConversion([&](cir::FuncType type) -> std::optional<mlir::Type> 
{
     auto result = converter.convertType(type.getReturnType());
+    if (!result)
+      return std::nullopt;
     llvm::SmallVector<mlir::Type> arguments;
     arguments.reserve(type.getNumInputs());
     if (converter.convertTypes(type.getInputs(), arguments).failed())
@@ -4813,8 +4856,10 @@ void ConvertCIRToLLVMPass::runOnOperation() {
   ops.push_back(module);
   cir::collectUnreachable(module, ops);
 
-  if (failed(applyPartialConversion(ops, target, std::move(patterns))))
+  if (failed(applyPartialConversion(ops, target, std::move(patterns)))) {
     signalPassFailure();
+    return;
+  }
 
   // Drop the cir.ptr-keyed data-layout entries: they drove pointer-width
   // queries up to this point, but the LLVM IR exporter rejects CIR types.
@@ -5209,6 +5254,11 @@ getValueForVTableSymbol(mlir::Operation *op,
     eltType = llvmSymbol.getType();
   } else if (auto cirSymbol = mlir::dyn_cast<cir::GlobalOp>(symbol)) {
     eltType = converter->convertType(cirSymbol.getSymType());
+    if (!eltType) {
+      emitTypeConversionError(op, cirSymbol.getSymType())
+          << " for vtable symbol " << nameAttr;
+      return {};
+    }
   } else {
     op->emitError() << "unexpected symbol type for " << symbol;
     return {};
@@ -5229,7 +5279,7 @@ mlir::LogicalResult 
CIRToLLVMVTableAddrPointOpLowering::matchAndRewrite(
   mlir::Value symAddr = getValueForVTableSymbol(
       op, rewriter, symbolTables, converter, op.getNameAttr(), eltType);
   if (!symAddr)
-    return op.emitError() << "Unable to get value for vtable symbol";
+    return mlir::failure();
 
   offsets = llvm::SmallVector<mlir::LLVM::GEPArg>{
       0, op.getAddressPointAttr().getIndex(),
@@ -5287,6 +5337,8 @@ mlir::LogicalResult 
CIRToLLVMVTTAddrPointOpLowering::matchAndRewrite(
     llvmAddr =
         getValueForVTableSymbol(op, rewriter, symbolTables, getTypeConverter(),
                                 op.getNameAttr(), eltType);
+    if (!llvmAddr)
+      return mlir::failure();
     assert(eltType && "Shouldn't ever be missing an eltType here");
     offsets.push_back(0);
     offsets.push_back(adaptor.getOffset());
@@ -6076,8 +6128,11 @@ mlir::LogicalResult 
CIRToLLVMInlineAsmOpLowering::matchAndRewrite(
     cir::InlineAsmOp op, OpAdaptor adaptor,
     mlir::ConversionPatternRewriter &rewriter) const {
   mlir::Type llResTy;
-  if (op.getNumResults())
+  if (op.getNumResults()) {
     llResTy = getTypeConverter()->convertType(op.getType(0));
+    if (!llResTy)
+      return emitTypeConversionError(op, op.getType(0));
+  }
 
   cir::AsmFlavor dialect = op.getAsmFlavor();
   mlir::LLVM::AsmDialect llDialect = dialect == cir::AsmFlavor::x86_att

diff  --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
index b491e616cf972..c71ae0c93f9d4 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
@@ -24,9 +24,10 @@ namespace direct {
 
 struct LLVMBlockAddressInfo;
 
-/// Convert a CIR attribute to an LLVM attribute. May use the datalayout for
-/// lowering attributes to-be-stored in memory. When the attribute may contain
-/// block address attributes, `blockInfoAddr` is used to resolve them.
+/// Convert a CIR attribute to an LLVM value, or return null on failure.
+/// May use the datalayout for lowering attributes to-be-stored in memory. When
+/// the attribute may contain block address attributes, `blockInfoAddr` is used
+/// to resolve them.
 mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, mlir::Attribute 
attr,
                                 mlir::ConversionPatternRewriter &rewriter,
                                 mlir::SymbolTableCollection &symbolTables,

diff  --git a/clang/test/CIR/Lowering/unsupported-type-conversions.cir 
b/clang/test/CIR/Lowering/unsupported-type-conversions.cir
new file mode 100644
index 0000000000000..7740caf51f939
--- /dev/null
+++ b/clang/test/CIR/Lowering/unsupported-type-conversions.cir
@@ -0,0 +1,223 @@
+// RUN: cir-opt %s --split-input-file --cir-to-llvm -verify-diagnostics
+
+// Vector-of-_BitInt conversion is unsupported; propagate its failure to the
+// enclosing operation and diagnose the type that cannot be converted.
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.func'}}
+  cir.func private @function_result() -> !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 32, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 32, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.func'}}
+  cir.func private @function_argument(!vec)
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // The initializer requests FuncType conversion before the function lowers.
+  cir.global external @function_view = #cir.global_view<@callee> : 
!cir.ptr<!cir.void>
+
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.func'}}
+  cir.func private @callee() -> !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  cir.func @constant_result() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.const'}}
+    %0 = cir.const #cir.zero : !vec
+    cir.return
+  }
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  cir.func @cast_result() {
+    %0 = cir.const #cir.zero : !cir.vector<4 x !cir.int<s, 7>>
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.cast'}}
+    %1 = cir.cast bitcast %0 : !cir.vector<4 x !cir.int<s, 7>> -> !vec
+    cir.return
+  }
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  cir.func @asm_result() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.asm'}}
+    %0 = cir.asm(x86_att, out = [], in = [], in_out = [], {"" "=r"}) -> !vec
+    cir.return
+  }
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Lower the constant before its target to exercise symbol-type failure.
+  cir.func @constant_global_view() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.const'}}
+    %0 = cir.const #cir.global_view<@target, [0 : i32]> : !ptr
+    cir.return
+  }
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Lower the constant before its target to exercise symbol-type failure.
+  cir.func @constant_array_view() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.const'}}
+    %0 = cir.const #cir.const_array<[#cir.global_view<@target, [0 : i32]> : 
!ptr]> : !cir.array<!ptr x 1>
+    cir.return
+  }
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Lower the constant before its target to exercise symbol-type failure.
+  cir.func @constant_record_view() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+    // expected-error @below {{failed to legalize operation 'cir.const'}}
+    %0 = cir.const #cir.const_record<{#cir.global_view<@target, [0 : i32]> : 
!ptr}> : !cir.struct<{data !ptr}>
+    cir.return
+  }
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Propagate initializer failure before lowering the referenced global.
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.global'}}
+  cir.global external @global_view = #cir.global_view<@target, [0 : i32]> : 
!ptr
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Conversion failure rolls back the unresolved block address. Stop before
+  // attempting to resolve it against a label that has not been lowered.
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.global'}}
+  cir.global external @block_address_view = 
#cir.const_array<[#cir.block_addr_info<@f, "L"> : !ptr, 
#cir.global_view<@target, [0 : i32]> : !ptr]> : !cir.array<!ptr x 2>
+
+  cir.func @f() {
+    cir.br ^bb1
+  ^bb1:
+    cir.label "L"
+    cir.return
+  }
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Propagate initializer failure before lowering the referenced global.
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.global'}}
+  cir.global external @typeinfo_view = 
#cir.typeinfo<{#cir.global_view<@target, [0 : i32]> : !ptr}> : 
!cir.struct<{data !ptr}>
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // Propagate initializer failure before lowering the referenced global.
+  // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.vector<4 x !cir.int<s, 7, bitint>>'}}
+  // expected-error @below {{failed to legalize operation 'cir.global'}}
+  cir.global external @vtable_view = 
#cir.vtable<{#cir.const_array<[#cir.global_view<@target, [0 : i32]> : !ptr]> : 
!cir.array<!ptr x 1>}> : !cir.struct<{data !cir.array<!ptr x 1>}>
+
+  cir.global external @target = #cir.zero : !vec
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // The address point requests the symbol type before the global lowers.
+  cir.func @vtable_symbol() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.struct<{data !cir.array<!cir.vector<4 x !cir.int<s, 7, bitint>> x 1>}>' 
for vtable symbol @target}}
+    // expected-error @below {{failed to legalize operation 
'cir.vtable.address_point'}}
+    %0 = cir.vtable.address_point(@target, address_point = <index = 0, offset 
= 0>) : !cir.vptr
+    cir.return
+  }
+
+  cir.global "private" external @target : !cir.struct<{data !cir.array<!vec x 
1>}>
+}
+
+// -----
+
+!vec = !cir.vector<4 x !cir.int<s, 7, bitint>>
+!ptr = !cir.ptr<!cir.void>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  // The address point requests the symbol type before the global lowers.
+  cir.func @vtt_symbol() {
+    // expected-error @below {{ClangIR lowering NYI: cannot convert 
'!cir.array<!cir.vector<4 x !cir.int<s, 7, bitint>> x 1>' for vtable symbol 
@target}}
+    // expected-error @below {{failed to legalize operation 
'cir.vtt.address_point'}}
+    %0 = cir.vtt.address_point @target, offset = 0 -> !cir.ptr<!ptr>
+    cir.return
+  }
+
+  cir.global "private" external @target : !cir.array<!vec x 1>
+}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to