Skip to content

Commit 0d3dba8

Browse files
committed
Fix existing tests and add new tests.
1 parent 1060ed3 commit 0d3dba8

14 files changed

+107
-25
lines changed

gcc/rust/hir/rust-ast-lower-block.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ASTLoweringBlock : public ASTLoweringBase
4343
}
4444

4545
if (terminated != nullptr)
46-
*terminated = resolver.terminated;
46+
*terminated |= resolver.terminated;
4747
return resolver.translated;
4848
}
4949

@@ -76,7 +76,7 @@ class ASTLoweringIfBlock : public ASTLoweringBase
7676
resolver.translated->get_mappings ().get_hirid (),
7777
resolver.translated);
7878
}
79-
*terminated = resolver.terminated;
79+
*terminated |= resolver.terminated;
8080
return resolver.translated;
8181
}
8282

@@ -115,7 +115,7 @@ class ASTLoweringExprWithBlock : public ASTLoweringBase
115115
resolver.translated);
116116
}
117117

118-
*terminated = resolver.terminated;
118+
*terminated |= resolver.terminated;
119119
return resolver.translated;
120120
}
121121

gcc/rust/hir/rust-ast-lower-expr.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class ASTLoweringExpr : public ASTLoweringBase
109109
expr->get_locus_slow ());
110110

111111
if (terminated != nullptr)
112-
*terminated = resolver.terminated;
112+
*terminated |= resolver.terminated;
113113

114114
return resolver.translated;
115115
}
@@ -351,7 +351,6 @@ class ASTLoweringExpr : public ASTLoweringBase
351351
"failed to fold capacity constant");
352352
return;
353353
}
354-
rust_assert (!terminated);
355354

356355
translated_array_elems
357356
= new HIR::ArrayElemsCopied (std::unique_ptr<HIR::Expr> (element),

gcc/rust/hir/rust-ast-lower-struct-field-expr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ASTLowerStructExprField : public ASTLoweringBase
4646
field->get_locus_slow ());
4747

4848
if (terminated)
49-
*terminated = compiler.terminated;
49+
*terminated |= compiler.terminated;
5050

5151
return compiler.translated;
5252
}

gcc/rust/parse/rust-parse-impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -7613,6 +7613,7 @@ Parser<ManagedTokenSource>::parse_return_expr (
76137613
case RIGHT_CURLY:
76147614
case RIGHT_PAREN:
76157615
case RIGHT_SQUARE:
7616+
case COMMA:
76167617
break;
76177618
default:
76187619
returned_expr
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,40 @@
1-
fn foo() -> isize {
1+
fn foo() -> i32 {
22
0
33
}
44

5+
fn bar() -> i32 {
6+
foo();
7+
foo()
8+
}
9+
10+
fn baz() -> i32 {
11+
{
12+
bar();
13+
bar();
14+
}
15+
{
16+
bar();
17+
bar()
18+
};
19+
{
20+
bar();
21+
bar()
22+
}
23+
}
24+
25+
fn test(ok: i32) -> i32 {
26+
if ok >= 1 {
27+
foo()
28+
} else if ok <= -1 {
29+
bar()
30+
} else {
31+
baz()
32+
}
33+
}
34+
535
fn main() {
636
let a = foo();
7-
// { dg-warning "unused name" "" { target *-*-* } .-1 }
37+
let b = bar();
38+
let c = baz();
39+
test(a + b + c);
840
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
fn foo(x: i32) -> f32 {
2+
let y = if x > 1 {
3+
return 2.0;
4+
} else {
5+
1
6+
};
7+
8+
let z = if x < -1 {
9+
-1
10+
} else {
11+
return -2.0;
12+
};
13+
14+
let mut w: (f32, i32, f32) = (2.3, y + z, 3.3);
15+
w = (1.0, return 0.0, -1.0);
16+
w = (6.6, 66, 6.6); // { dg-warning "unreachable statement" }
17+
}
18+
19+
fn main() {
20+
foo(-2);
21+
foo(0);
22+
foo(2);
23+
}

gcc/testsuite/rust.test/compile/unused.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ fn f() {
1414

1515
fn main() {
1616
f();
17-
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
// { dg-excess-errors "Noisy error and debug" }
2-
fn main() { // { dg-error "expected .... got .<tyty::error>." }
1+
fn main() {
32
let a;
43
a = 1;
5-
break a; // { dg-error "cannot `break` outside of a loop"
4+
break a; // { dg-error "cannot `break` outside of a loop" }
65
// { dg-error "failed to type resolve expression" "" { target { *-*-* } } .-1 }
76
}

gcc/testsuite/rust.test/xfail_compile/continue1.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ fn main() {
55
let _fib = {
66
continue; // { dg-error "cannot `continue` outside of a loop" }
77
// { dg-error "failed to type resolve expression" "" { target { *-*-* } } .-1 }
8-
123
8+
123 // { dg-warning "unreachable expression" }
99
};
1010
}

gcc/testsuite/rust.test/xfail_compile/func1.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fn test(x: i32) -> bool { // { dg-error "expected .bool. got .<tyty::error>.." }
1+
fn test(x: i32) -> bool {
22
return x + 1; // { dg-error "expected .bool. got .i32." }
33
}
44

gcc/testsuite/rust.test/xfail_compile/implicit_returns_err1.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
1-
// { dg-error "expected .* got .*" "" { target { *-*-* } } 0 }
2-
31
fn test(x: i32) -> i32 {
4-
if x > 1 {
2+
if x > 1 { // { dg-error "expected .... got .<integer>." }
53
1
64
} else {
75
2
86
}
9-
3
7+
8+
{ // { dg-error "expected .... got .<integer>." }
9+
3
10+
}
11+
12+
if x > 1 { 1 } else { 2 };
13+
if x > 1 { 1; } else { 2; }
14+
15+
{ 3; }
16+
{ 3 };
17+
18+
{ 3 }
1019
}
1120

1221
fn main() {

gcc/testsuite/rust.test/xfail_compile/implicit_returns_err2.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
// { dg-error "expected .* got .*" "" { target { *-*-* } } 0 }
2-
31
fn test(x: i32) -> i32 {
4-
return 1;
5-
// { dg-warning "unreachable expression" "" { target *-*-* } .+1 }
6-
true
2+
return true; // { dg-error "expected .i32. got .bool." }
3+
1 // { dg-warning "unreachable expression" }
74
}
85

96
fn main() {

gcc/testsuite/rust.test/xfail_compile/implicit_returns_err3.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
// { dg-error "expected .* got .*" "" { target { *-*-* } } 0 }
2-
fn test(x: i32) -> i32 {
1+
fn test(x: i32) -> i32 { // { dg-error "expected .i32. got ...." }
32
if x > 1 {
43
1
54
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
fn main() {
2+
let x = 0.0;
3+
let a = {
4+
loop {
5+
let c = if x > 0.0 {
6+
break 3;
7+
} else if x < 0.0 {
8+
x
9+
} else {
10+
return;
11+
};
12+
if x == 0.0 {
13+
break c; // { dg-error "expected .<integer>. got .<float>." }
14+
} else {
15+
continue;
16+
}
17+
return; // { dg-warning "unreachable statement" }
18+
}
19+
};
20+
21+
let a = 1 + return; // { dg-error "cannot apply this operator to types <integer> and !" }
22+
// { dg-error "failed to type resolve expression" "" { target { *-*-* } } .-1 }
23+
}

0 commit comments

Comments
 (0)