Skip to content

Commit f70358c

Browse files
Harden M0 template specialization and closure diagnostics
1 parent 61a4956 commit f70358c

33 files changed

Lines changed: 982 additions & 34 deletions

Language/Types/ParametricsM0/invalid/recursive_instantiation.octfail

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
expect error: "infinite template instantiation detected"
1+
expect error: "possible infinite type-growth specialization"
22

33
package ParametricsM0InvalidRecursion
44

5+
template record Box<T> {
6+
Value: T
7+
}
8+
59
template fn Recur<T>(value: T) -> T {
6-
return Recur<T>(value)
10+
return Recur<Box<T>>(Box<T> {Value: value}).Value
711
}
812

913
fn Main() -> Int {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
expect error: "function expects Float<m>, but return is Float<m^2>"
2+
3+
package TemplateTortureDimensionalInvalid
4+
5+
template fn SquareSameType<T>(value: T) -> T {
6+
return value * value
7+
}
8+
9+
fn Main() -> Float<m> {
10+
return SquareSameType<Float<m>>(2.0m)
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
expect error: "possible infinite type-growth specialization"
2+
3+
package TemplateTortureGrowthInvalid
4+
5+
template record Box<T> {Value: T}
6+
7+
template fn Grow<T>(value: T) -> T {
8+
return Grow<Box<T>>(Box<T> {Value: value}).Value
9+
}
10+
11+
fn Main() -> Int {
12+
return Grow<Int>(1)
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
expect error: "does not accept type arguments"
2+
3+
package TemplateTortureOrdinaryGenericInvalid
4+
5+
fn Identity(value: Int) -> Int {return value}
6+
7+
fn Main() -> Int {
8+
return Identity<Int>(1)
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
expect error: "not defined for String and String"
2+
3+
package TemplateTortureNonnumericInvalid
4+
5+
template fn SquareSameType<T>(value: T) -> T {
6+
return value * value
7+
}
8+
9+
fn Main() -> String {
10+
return SquareSameType<String>("bad")
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
expect error: "cannot add m and m*s"
2+
3+
package TemplateTortureODEInvalid
4+
5+
template fn EulerStep<State, Derivative, Time>(state: State, derivative: Derivative, dt: Time) -> State {
6+
return state + derivative * dt
7+
}
8+
9+
fn Main() -> Float<m> {
10+
return EulerStep<Float<m>, Float<m>, Float<s>>(1.0m, 3.0m, 2.0s)
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
expect error: "invalid compile-time-known construction of refined concept PositiveLength"
2+
3+
package TemplateTortureRefinementInvalid
4+
5+
concept PositiveLength = Float<m> {
6+
Require(Self > 0.0m, "length must be positive")
7+
}
8+
9+
template fn Preserve<T>(value: T) -> T {
10+
return value
11+
}
12+
13+
fn Main() -> PositiveLength {
14+
return Preserve<PositiveLength>(-1.0m)
15+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
expect error: "expected 'record', 'fn', 'flow', or 'query' after 'template'"
2+
3+
package TemplateTortureEnumInvalid
4+
5+
template enum Option<T> {
6+
None
7+
Some(T)
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
expect error: "undefined variable: T"
2+
3+
package TemplateTortureTypeParameterValueInvalid
4+
5+
template fn TypeIsNotAValue<T>() -> Int {
6+
return T
7+
}
8+
9+
fn Main() -> Int {
10+
return TypeIsNotAValue<Int>()
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
expect error: "expects 2 type arguments, got 1"
2+
3+
package TemplateTortureArityInvalid
4+
5+
template fn Choose<T, U>(value: T, fallback: U) -> T {
6+
return value
7+
}
8+
9+
fn Main() -> Int {
10+
return Choose<Int>(1, 2)
11+
}

0 commit comments

Comments
 (0)