Files
swift-mirror/test/SILGen/manual_ownership.swift
Kavon Farvardin 2d881bdc9c ManualOwnership: provide ability to apply to entire compilation unit
With this patch, I'm flipping the polarity of things.

The flag `-enable-experimental-feature ManualOwnership` now turns on the diagnostics,
but they're all silenced by default. So, you need to add -Wwarning or -Werror to
your build settings to turn on the specific diagnostics you care about.

These are the diagnostic groups relevant to the feature:

- SemanticCopies aka "explicit copies mode"
- DynamicExclusivity

For example, the build setting `-Werror SemanticCopies` now gives you errors about
explicit copies, just as before, but now you can make them just warnings with -Wwarning.

To opt-out a declaration from everything when using the feature, use @_noManualOwnership.

@_manualOwnership is no longer an attribute as a result.

resolves rdar://163372569
2025-10-24 18:54:07 -07:00

92 lines
3.6 KiB
Swift

// RUN: %target-swift-frontend %s -emit-silgen -verify -sil-verify-all \
// RUN: -enable-experimental-feature ManualOwnership -o %t.silgen
// RUN: %FileCheck %s --input-file %t.silgen
// REQUIRES: swift_feature_ManualOwnership
class ShapeClass {}
class TriangleClass {
var shape = ShapeClass()
}
// CHECK-LABEL: sil {{.*}} @basic_access_of_loadable
// CHECK: bb0(%0 : @guaranteed $TriangleClass):
// CHECK-NEXT: debug_value %0
// CHECK-NEXT: [[M:%.*]] = class_method %0, #TriangleClass.shape!getter
// CHECK-NEXT: [[SHAPE:%.*]] = apply [[M]](%0)
// CHECK-NEXT: [[COPY:%.*]] = explicit_copy_value [[SHAPE]]
// CHECK-NEXT: destroy_value [[SHAPE]]
// CHECK-NEXT: return [[COPY]]
// CHECK-NEXT: } // end sil function 'basic_access_of_loadable'
@_silgen_name("basic_access_of_loadable")
func basic_access_of_loadable(_ t: TriangleClass) -> ShapeClass {
return copy t.shape
}
// CHECK-LABEL: sil {{.*}} @var_assign
// CHECK: alloc_box ${ var TriangleClass }, var, name "x"
// CHECK-NEXT: begin_borrow [lexical] [var_decl]
// CHECK-NEXT: [[VAR:%.*]] = project_box {{.*}}, 0
// CHECK: bb1:
// CHECK-NEXT: [[T_COPY:%.*]] = explicit_copy_value %0
// CHECK-NEXT: [[ADDR1:%.*]] = begin_access [modify] [unknown] [[VAR]]
// CHECK-NEXT: assign [[T_COPY]] to [[ADDR1]]
// CHECK-NEXT: end_access [[ADDR1]]
// CHECK: bb3:
// CHECK-NEXT: [[ADDR2:%.*]] = begin_access [read] [unknown] [[VAR]]
// CHECK-NEXT: [[LOAD:%.*]] = load [copy] [[ADDR2]]
// CHECK-NEXT: [[X_COPY:%.*]] = explicit_copy_value [[LOAD]]
// CHECK-NEXT: end_access [[ADDR2]]
// CHECK: return [[X_COPY]]
// CHECK-NEXT: } // end sil function 'var_assign'
@_silgen_name("var_assign")
func var_assign(_ t: TriangleClass, _ b: Bool) -> TriangleClass {
var x = TriangleClass()
if b { x = copy t }
return copy x
}
// CHECK-LABEL: sil {{.*}} [manual_ownership] [ossa] @return_borrowed
// CHECK: bb0(%0 : @guaranteed $TriangleClass):
// CHECK-NEXT: debug_value %0
// CHECK-NEXT: [[IMPL_COPY:%.*]] = copy_value %0
// CHECK-NEXT: return [[IMPL_COPY]]
// CHECK-NEXT: } // end sil function 'return_borrowed'
@_silgen_name("return_borrowed")
func return_borrowed(_ t: borrowing TriangleClass) -> TriangleClass {
return t
}
// CHECK-LABEL: sil {{.*}} [manual_ownership] [ossa] @return_consumingParam
// CHECK: bb0(%0 : @_eagerMove @owned $TriangleClass):
// CHECK-NEXT: alloc_box ${ var TriangleClass }, var, name "t"
// CHECK-NEXT: begin_borrow [var_decl]
// CHECK-NEXT: [[ADDR:%.*]] = project_box {{.*}}, 0
// CHECK-NEXT: store %0 to [init] [[ADDR]]
// CHECK-NEXT: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
// CHECK-NEXT: [[IMPL_COPY:%.*]] = load [copy] [[ACCESS]]
// CHECK-NEXT: end_access [[ACCESS]]
// CHECK-NEXT: end_borrow
// CHECK-NEXT: destroy_value
// CHECK-NEXT: return [[IMPL_COPY]]
// CHECK-NEXT: } // end sil function 'return_consumingParam'
@_silgen_name("return_consumingParam")
func return_consumingParam(_ t: consuming TriangleClass) -> TriangleClass {
return t
}
// CHECK-LABEL: sil {{.*}} [manual_ownership] [ossa] @return_owned
// CHECK: bb0(%0 : @owned $TriangleClass):
// CHECK-NEXT: debug_value %0
// CHECK-NEXT: [[BORROW:%.*]] = begin_borrow %0
// CHECK-NEXT: [[IMPL_COPY:%.*]] = copy_value [[BORROW]]
// CHECK-NEXT: end_borrow [[BORROW]]
// CHECK-NEXT: destroy_value %0
// CHECK-NEXT: return [[IMPL_COPY]]
// CHECK-NEXT: } // end sil function 'return_owned'
@_silgen_name("return_owned")
func return_owned(_ t: __owned TriangleClass) -> TriangleClass {
return t
}