You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Allow a value of type MaybeUnformed(T) to convert to T with unsafe as (#6014)
We already allowed this for reference expressions; this extends the
support to also cover value expressions. This requires a little more
work because the value representation of `T` and `MaybeUnformed(T)`
don't necessarily match in general.
Copy file name to clipboardExpand all lines: toolchain/check/testdata/as/maybe_unformed.carbon
+41-45Lines changed: 41 additions & 45 deletions
Original file line number
Diff line number
Diff line change
@@ -78,6 +78,16 @@ fn Use() {
78
78
// CHECK:STDERR: ^~~~~~~~~~~
79
79
// CHECK:STDERR:
80
80
var i: X=Init() asX;
81
+
// TODO: The diagnostic should explain that the reason we can't perform this
82
+
// conversion is due to the expression category.
83
+
// CHECK:STDERR: fail_cannot_remove_unformed.carbon:[[@LINE+7]]:14: error: cannot convert expression of type `Core.MaybeUnformed(X)` to `X` with `unsafe as` [ConversionFailure]
84
+
// CHECK:STDERR: var j: X = Init() unsafe as X;
85
+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
86
+
// CHECK:STDERR: fail_cannot_remove_unformed.carbon:[[@LINE+4]]:14: note: type `Core.MaybeUnformed(X)` does not implement interface `Core.UnsafeAs(X)` [MissingImplInMemberAccessNote]
87
+
// CHECK:STDERR: var j: X = Init() unsafe as X;
88
+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
89
+
// CHECK:STDERR:
90
+
var j: X=Init() unsafeasX;
81
91
// CHECK:STDERR: fail_cannot_remove_unformed.carbon:[[@LINE+7]]:14: error: cannot convert expression of type `Core.MaybeUnformed(X)` to `X` with `as` [ConversionFailure]
// CHECK:STDERR: fail_todo_remove_unformed_unsafe_notref.carbon:[[@LINE+7]]:14: error: cannot convert expression of type `Core.MaybeUnformed(X)` to `X` with `unsafe as` [ConversionFailure]
135
-
// CHECK:STDERR: var i: X = Init() unsafe as X;
136
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
137
-
// CHECK:STDERR: fail_todo_remove_unformed_unsafe_notref.carbon:[[@LINE+4]]:14: note: type `Core.MaybeUnformed(X)` does not implement interface `Core.UnsafeAs(X)` [MissingImplInMemberAccessNote]
138
-
// CHECK:STDERR: var i: X = Init() unsafe as X;
139
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~
140
-
// CHECK:STDERR:
141
-
var i: X=Init() unsafeasX;
142
-
// CHECK:STDERR: fail_todo_remove_unformed_unsafe_notref.carbon:[[@LINE+7]]:14: error: cannot convert expression of type `Core.MaybeUnformed(X)` to `X` with `unsafe as` [ConversionFailure]
143
-
// CHECK:STDERR: let v: X = value unsafe as X;
144
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~
145
-
// CHECK:STDERR: fail_todo_remove_unformed_unsafe_notref.carbon:[[@LINE+4]]:14: note: type `Core.MaybeUnformed(X)` does not implement interface `Core.UnsafeAs(X)` [MissingImplInMemberAccessNote]
146
-
// CHECK:STDERR: let v: X = value unsafe as X;
147
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~
148
-
// CHECK:STDERR:
149
-
let v: X= value unsafeasX;
150
-
}
151
-
152
136
// CHECK:STDOUT: --- add_unformed.carbon
153
137
// CHECK:STDOUT:
154
138
// CHECK:STDOUT: constants {
@@ -321,6 +305,7 @@ fn Use() {
321
305
// CHECK:STDOUT: %pattern_type.1c6: type = pattern_type %ptr.d17 [concrete]
322
306
// CHECK:STDOUT: %MaybeUnformed.275: type = class_type @MaybeUnformed, @MaybeUnformed(%X) [concrete]
323
307
// CHECK:STDOUT: %ptr.58e: type = ptr_type %MaybeUnformed.275 [concrete]
308
+
// CHECK:STDOUT: %pattern_type.019: type = pattern_type %X [concrete]
324
309
// CHECK:STDOUT: %reference.var: ref %X = var file.%reference.var_patt [concrete]
0 commit comments