Skip to content

Commit c9f685e

Browse files
authored
Merge branch 'master' into josh/remove_forc_explore
2 parents 6af8137 + 586a968 commit c9f685e

File tree

11 files changed

+179
-88
lines changed

11 files changed

+179
-88
lines changed

docs/book/src/reference/compiler_intrinsics.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ __addr_of<T>(val: T) -> raw_ptr
120120

121121
**Description:** Returns the address in memory where `val` is stored.
122122

123-
**Constraints:** `T` is a reference type.
123+
**Constraints:** None.
124124

125125
---
126126

sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,6 @@ fn type_check_gtf(
10211021

10221022
/// Signature: `__addr_of<T>(val: T) -> raw_ptr`
10231023
/// Description: Returns the address in memory where `val` is stored.
1024-
/// Constraints: `T` is a reference type.
10251024
fn type_check_addr_of(
10261025
handler: &Handler,
10271026
ctx: TypeCheckContext,
@@ -1042,18 +1041,6 @@ fn type_check_addr_of(
10421041
.with_help_text("")
10431042
.with_type_annotation(type_engine.new_unknown());
10441043
let exp = ty::TyExpression::type_check(handler, ctx, &arguments[0])?;
1045-
let copy_type_info = type_engine
1046-
.to_typeinfo(exp.return_type, &span)
1047-
.map_err(|e| handler.emit_err(e.into()))
1048-
.unwrap_or_else(TypeInfo::ErrorRecovery);
1049-
if copy_type_info.is_copy_type() {
1050-
return Err(handler.emit_err(CompileError::IntrinsicUnsupportedArgType {
1051-
name: kind.to_string(),
1052-
span,
1053-
hint: "Only a reference type can be used as argument here".to_string(),
1054-
}));
1055-
}
1056-
10571044
let intrinsic_function = ty::TyIntrinsicFunctionKind {
10581045
kind,
10591046
arguments: vec![exp],

test/src/e2e_vm_tests/test_programs/should_fail/addrof_intrinsic/Forc.lock

Lines changed: 0 additions & 8 deletions
This file was deleted.

test/src/e2e_vm_tests/test_programs/should_fail/addrof_intrinsic/Forc.toml

Lines changed: 0 additions & 8 deletions
This file was deleted.

test/src/e2e_vm_tests/test_programs/should_fail/addrof_intrinsic/json_abi_oracle.json

Lines changed: 0 additions & 15 deletions
This file was deleted.

test/src/e2e_vm_tests/test_programs/should_fail/addrof_intrinsic/src/main.sw

Lines changed: 0 additions & 10 deletions
This file was deleted.

test/src/e2e_vm_tests/test_programs/should_fail/addrof_intrinsic/test.toml

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
[[package]]
2-
name = 'addrof_intrinsic'
3-
source = 'member'
4-
dependencies = ['std']
2+
name = "addrof_intrinsic"
3+
source = "member"
4+
dependencies = ["std"]
55

66
[[package]]
7-
name = 'core'
8-
source = 'path+from-root-B3EAB3022B5FAD04'
9-
10-
[[package]]
11-
name = 'std'
12-
source = 'path+from-root-B3EAB3022B5FAD04'
13-
dependencies = ['core']
7+
name = "std"
8+
source = "path+from-root-B3EAB3022B5FAD04"
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"concreteTypes": [
3+
{
4+
"concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
5+
"type": "()"
6+
}
7+
],
8+
"configurables": [],
9+
"encodingVersion": "1",
10+
"errorCodes": {},
11+
"functions": [
12+
{
13+
"attributes": null,
14+
"inputs": [],
15+
"name": "main",
16+
"output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
17+
}
18+
],
19+
"loggedTypes": [],
20+
"messagesTypes": [],
21+
"metadataTypes": [],
22+
"programType": "script",
23+
"specVersion": "1.1"
24+
}
Lines changed: 146 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
script;
22

3-
const B1 = Address {
4-
value: 0x0100000000000000000000000000000000000000000000000000000000000010
5-
};
6-
7-
pub fn addr_of<T>(val: T) -> raw_ptr {
8-
if !__is_reference_type::<T>() {
9-
revert(0);
10-
}
3+
pub fn as_raw_ptr<T>(val: &T) -> raw_ptr {
114
asm(ptr: val) {
125
ptr: raw_ptr
136
}
@@ -18,21 +11,158 @@ enum X {
1811
B: u64,
1912
}
2013

21-
fn main() {
22-
let sender = Identity::Address(B1);
23-
assert (__addr_of(sender) == addr_of(sender));
14+
struct Y {
15+
a: u32,
16+
b: u64,
17+
}
18+
19+
const A_U256: u256 = 0x0;
20+
const B_U256: u256 = 0x1;
21+
22+
const A_U32: u32 = 0;
23+
const B_U32: u32 = 1;
24+
25+
const A_BOOL: bool = true;
26+
const B_BOOL: bool = false;
27+
28+
const A_U64: u64 = 0;
29+
const B_U64: u64 = 1;
30+
31+
const A_X: X = X::A(0);
32+
const B_X: X = X::B(1);
2433

34+
const A_Y: Y = Y { a: 0, b: 1 };
35+
const B_Y: Y = Y { a: 1, b: 2 };
36+
37+
fn main() {
2538
let x = X::A(2);
2639
let y = X::B(22);
27-
assert(__addr_of(x) == addr_of(x));
28-
assert(__addr_of(x) != addr_of(y));
40+
assert(__addr_of(x) == as_raw_ptr(&x));
41+
assert(__addr_of(x) != as_raw_ptr(&y));
42+
43+
let y = Y { a: 2, b: 22 };
44+
let z = Y { a: 3, b: 23 };
45+
assert(__addr_of(y) == as_raw_ptr(&y));
46+
assert(__addr_of(y) != as_raw_ptr(&z));
47+
48+
let addr_y_a = __addr_of(y.a);
49+
let addr_y_b = __addr_of(y.b);
50+
assert(addr_y_a == as_raw_ptr(&y.a));
51+
assert(addr_y_b == as_raw_ptr(&y.b));
52+
assert(addr_y_a != addr_y_b);
2953

3054
let a = [1,2,3];
31-
assert(__addr_of(a) == addr_of(a));
55+
assert(__addr_of(a) == as_raw_ptr(&a));
3256

3357
let b = "hello";
34-
assert(__addr_of(b) == addr_of(b));
58+
assert(__addr_of(b) == as_raw_ptr(&b));
3559

3660
let c = (1, 2);
37-
assert(__addr_of(c) == addr_of(c));
61+
assert(__addr_of(c) == as_raw_ptr(&c));
62+
63+
let i1 = 42u64;
64+
let i2 = 43u64;
65+
assert(__addr_of(i1) == as_raw_ptr(&i1));
66+
assert(__addr_of(i1) != as_raw_ptr(&i2));
67+
68+
let b1 = true;
69+
let b2 = false;
70+
assert(__addr_of(b1) == as_raw_ptr(&b1));
71+
assert(__addr_of(b1) != as_raw_ptr(&b2));
72+
73+
let u8_1 = 8u8;
74+
let u8_2 = 9u8;
75+
assert(__addr_of(u8_1) == as_raw_ptr(&u8_1));
76+
assert(__addr_of(u8_1) != as_raw_ptr(&u8_2));
77+
78+
let u256_1: u256 = 0x0000000000000000000000000000000000000000000000000000000000000001u256;
79+
let u256_2: u256 = 0x0000000000000000000000000000000000000000000000000000000000000002u256;
80+
assert(__addr_of(u256_1) == as_raw_ptr(&u256_1));
81+
assert(__addr_of(u256_1) != as_raw_ptr(&u256_2));
82+
83+
let addr_addr_of = __addr_of(__addr_of(x));
84+
assert (!addr_addr_of.is_null());
85+
assert(__addr_of(__addr_of(x)) != __addr_of(x));
86+
87+
let some_temp = __addr_of(1 + 4);
88+
assert(!some_temp.is_null());
89+
90+
let raw_ptr = __addr_of(x);
91+
assert(!raw_ptr.is_null());
92+
93+
const X1: u32 = 42;
94+
const Y1: u32 = 43;
95+
assert(__addr_of(X1) == as_raw_ptr(&X1));
96+
assert(__addr_of(X1) != as_raw_ptr(&Y1));
97+
assert(__addr_of(X1) != __addr_of(Y1));
98+
99+
const X2: u64 = 42;
100+
const Y2: u64 = 43;
101+
assert(__addr_of(X2) == as_raw_ptr(&X2));
102+
assert(__addr_of(X2) != as_raw_ptr(&Y2));
103+
assert(__addr_of(X2) != __addr_of(Y2));
104+
105+
const X3: u256 = 42u256;
106+
const Y3: u256 = 43u256;
107+
assert(__addr_of(X3) == as_raw_ptr(&X3));
108+
assert(__addr_of(X3) != as_raw_ptr(&Y3));
109+
assert(__addr_of(X3) != __addr_of(Y3));
110+
111+
const X4: bool = true;
112+
const Y4: bool = false;
113+
assert(__addr_of(X4) == as_raw_ptr(&X4));
114+
assert(__addr_of(X4) != as_raw_ptr(&Y4));
115+
assert(__addr_of(X4) != __addr_of(Y4));
116+
117+
const X5: X = X::A(42);
118+
const Y5: X = X::B(43);
119+
assert(__addr_of(X5) == as_raw_ptr(&X5));
120+
assert(__addr_of(X5) != as_raw_ptr(&Y5));
121+
assert(__addr_of(X5) != __addr_of(Y5));
122+
123+
const X6: Y = Y { a: 42, b: 43 };
124+
const Y6: Y = Y { a: 44, b: 45 };
125+
assert(__addr_of(X6) == as_raw_ptr(&X6));
126+
assert(__addr_of(X6) != as_raw_ptr(&Y6));
127+
assert(__addr_of(X6) != __addr_of(Y6));
128+
129+
const X7: [u32; 3] = [1, 2, 3];
130+
const Y7: [u32; 3] = [4, 5, 6];
131+
assert(__addr_of(X7) == as_raw_ptr(&X7));
132+
assert(__addr_of(X7) != as_raw_ptr(&Y7));
133+
134+
const X8: (u32, u32) = (1, 2);
135+
const Y8: (u32, u32) = (3, 4);
136+
assert(__addr_of(X8) == as_raw_ptr(&X8));
137+
assert(__addr_of(X8) != as_raw_ptr(&Y8));
138+
139+
const X10: u8 = 8;
140+
const Y10: u8 = 9;
141+
assert(__addr_of(X10) == as_raw_ptr(&X10));
142+
assert(__addr_of(X10) != as_raw_ptr(&Y10));
143+
144+
assert(__addr_of(A_U256) == as_raw_ptr(&A_U256));
145+
assert(__addr_of(B_U256) == as_raw_ptr(&B_U256));
146+
assert(__addr_of(A_U256) != __addr_of(B_U256));
147+
148+
assert(__addr_of(A_U32) == as_raw_ptr(&A_U32));
149+
assert(__addr_of(B_U32) == as_raw_ptr(&B_U32));
150+
assert(__addr_of(A_U32) != __addr_of(B_U32));
151+
assert(__addr_of(A_U32) != __addr_of(A_U256));
152+
153+
assert(__addr_of(A_BOOL) == as_raw_ptr(&A_BOOL));
154+
assert(__addr_of(B_BOOL) == as_raw_ptr(&B_BOOL));
155+
assert(__addr_of(A_BOOL) != __addr_of(B_BOOL));
156+
157+
assert(__addr_of(A_U64) == as_raw_ptr(&A_U64));
158+
assert(__addr_of(B_U64) == as_raw_ptr(&B_U64));
159+
assert(__addr_of(A_U64) != __addr_of(B_U64));
160+
161+
assert(__addr_of(A_X) == as_raw_ptr(&A_X));
162+
assert(__addr_of(B_X) == as_raw_ptr(&B_X));
163+
assert(__addr_of(A_X) != __addr_of(B_X));
164+
165+
assert(__addr_of(A_Y) == as_raw_ptr(&A_Y));
166+
assert(__addr_of(B_Y) == as_raw_ptr(&B_Y));
167+
assert(__addr_of(A_Y) != __addr_of(B_Y));
38168
}

0 commit comments

Comments
 (0)