Skip to content

Commit 438ee33

Browse files
committed
[ConstraintSystem] Add new conversion kind - ArrayToCPointer
It's `ArrayToPointer` conversion that has PointerToCPointer semantics for (un-)signed integer element types.
1 parent ad24fe1 commit 438ee33

File tree

6 files changed

+12
-2
lines changed

6 files changed

+12
-2
lines changed

include/swift/Sema/Constraint.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ enum class ConversionRestrictionKind {
282282
InoutToCPointer,
283283
/// Array-to-pointer conversion.
284284
ArrayToPointer,
285+
/// Converting from array to a C pointer has `PointerToCPointer` semantics.
286+
ArrayToCPointer,
285287
/// String-to-pointer conversion.
286288
StringToPointer,
287289
/// Pointer-to-pointer conversion.

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6879,7 +6879,8 @@ Expr *ExprRewriter::coerceToType(Expr *expr, Type toType,
68796879
return result;
68806880
}
68816881

6882-
case ConversionRestrictionKind::ArrayToPointer: {
6882+
case ConversionRestrictionKind::ArrayToPointer:
6883+
case ConversionRestrictionKind::ArrayToCPointer: {
68836884
bool isOptional = false;
68846885
Type unwrappedTy = toType;
68856886
if (Type unwrapped = toType->getOptionalObjectType()) {

lib/Sema/CSDiagnostics.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7367,7 +7367,8 @@ void NonEphemeralConversionFailure::emitSuggestionNotes() const {
73677367

73687368
// Then try to find a suitable alternative.
73697369
switch (ConversionKind) {
7370-
case ConversionRestrictionKind::ArrayToPointer: {
7370+
case ConversionRestrictionKind::ArrayToPointer:
7371+
case ConversionRestrictionKind::ArrayToCPointer: {
73717372
// Don't suggest anything for optional arrays, as there's currently no
73727373
// direct alternative.
73737374
if (getArgType()->getOptionalObjectType())

lib/Sema/CSSimplify.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13436,6 +13436,9 @@ ConstraintSystem::simplifyRestrictedConstraintImpl(
1343613436
case ConversionRestrictionKind::PointerToCPointer:
1343713437
return simplifyPointerToCPointerRestriction(type1, type2, flags, locator);
1343813438

13439+
case ConversionRestrictionKind::ArrayToCPointer:
13440+
llvm_unreachable("not yet implemented");
13441+
1343913442
case ConversionRestrictionKind::InoutToCPointer: {
1344013443
SmallVector<Type, 2> optionals;
1344113444

lib/Sema/Constraint.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,8 @@ StringRef swift::constraints::getName(ConversionRestrictionKind kind) {
656656
return "[protocol-metatype-to-object]";
657657
case ConversionRestrictionKind::ArrayToPointer:
658658
return "[array-to-pointer]";
659+
case ConversionRestrictionKind::ArrayToCPointer:
660+
return "[array-to-c-pointer]";
659661
case ConversionRestrictionKind::StringToPointer:
660662
return "[string-to-pointer]";
661663
case ConversionRestrictionKind::InoutToPointer:

lib/Sema/ConstraintSystem.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6238,6 +6238,7 @@ ConstraintSystem::isConversionEphemeral(ConversionRestrictionKind conversion,
62386238
ConstraintLocatorBuilder locator) {
62396239
switch (conversion) {
62406240
case ConversionRestrictionKind::ArrayToPointer:
6241+
case ConversionRestrictionKind::ArrayToCPointer:
62416242
case ConversionRestrictionKind::StringToPointer:
62426243
// Always ephemeral.
62436244
return ConversionEphemeralness::Ephemeral;

0 commit comments

Comments
 (0)