From 2b00d3f1230a3eec6135090cf984e544f022af4a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 2 Oct 2025 10:27:44 -0700 Subject: [PATCH 1/2] Correctly sext instead of zext for negative integer types --- lib/IRGen/MetadataRequest.cpp | 11 +++++++++-- test/Interpreter/value_generics.swift | 27 ++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/IRGen/MetadataRequest.cpp b/lib/IRGen/MetadataRequest.cpp index 9a325e8e6e85e..911c8e0e05275 100644 --- a/lib/IRGen/MetadataRequest.cpp +++ b/lib/IRGen/MetadataRequest.cpp @@ -3592,8 +3592,15 @@ IRGenFunction::emitTypeMetadataRefForLayout(SILType ty, llvm::Value *IRGenFunction::emitValueGenericRef(CanType type) { if (auto integer = type->getAs()) { - return llvm::ConstantInt::get(IGM.SizeTy, - integer->getValue().zextOrTrunc(IGM.SizeTy->getBitWidth())); + auto value = integer->getValue(); + + if (integer->isNegative()) { + value = value.sextOrTrunc(IGM.SizeTy->getBitWidth()); + } else { + value = value.zextOrTrunc(IGM.SizeTy->getBitWidth()); + } + + return llvm::ConstantInt::get(IGM.SizeTy, value); } return tryGetLocalTypeData(type, LocalTypeDataKind::forValue()); diff --git a/test/Interpreter/value_generics.swift b/test/Interpreter/value_generics.swift index 10616bfe65f14..49aff648b7883 100644 --- a/test/Interpreter/value_generics.swift +++ b/test/Interpreter/value_generics.swift @@ -5,7 +5,11 @@ // REQUIRES: executable_test -struct A {} +struct A { + func foo() { + print("Lower: \(N), Upper: \(M)") + } +} extension A where N == 2 { struct B {} @@ -36,3 +40,24 @@ let x: A<-5, -5> = getA() // CHECK: main.A<-5, -5> print(_typeName(type(of: x), qualified: true)) + +// CHECK: Lower: 1, Upper: 8 +A<1, 8>().foo() + +// CHECK: Lower: 0, Upper: 8 +A<0, 8>().foo() + +// CHECK: Lower: -1, Upper: 8 +A< -1, 8>().foo() + +// CHECK: Lower: -2, Upper: 8 +A< -2, 8>().foo() + +// CHECK: Lower: -3, Upper: 8 +A< -3, 8>().foo() + +// CHECK: Lower: -4, Upper: 8 +A< -4, 8>().foo() + +// CHECK: Lower: -5, Upper: 8 +A< -5, 8>().foo() From bb5dfd317c2f7c567d699fd532069342404dbc12 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 2 Oct 2025 11:18:56 -0700 Subject: [PATCH 2/2] Always use sext --- lib/IRGen/MetadataRequest.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/IRGen/MetadataRequest.cpp b/lib/IRGen/MetadataRequest.cpp index 911c8e0e05275..72d5ef0af0903 100644 --- a/lib/IRGen/MetadataRequest.cpp +++ b/lib/IRGen/MetadataRequest.cpp @@ -3592,14 +3592,7 @@ IRGenFunction::emitTypeMetadataRefForLayout(SILType ty, llvm::Value *IRGenFunction::emitValueGenericRef(CanType type) { if (auto integer = type->getAs()) { - auto value = integer->getValue(); - - if (integer->isNegative()) { - value = value.sextOrTrunc(IGM.SizeTy->getBitWidth()); - } else { - value = value.zextOrTrunc(IGM.SizeTy->getBitWidth()); - } - + auto value = integer->getValue().sextOrTrunc(IGM.SizeTy->getBitWidth()); return llvm::ConstantInt::get(IGM.SizeTy, value); }