Skip to content

Commit aca5a52

Browse files
authored
fix: relax enum variant validation to warning for compatibility (#1547)
Change error E040 from an error to a warning when assigning non-standard values to enum types. This allows code that uses enum values outside the defined variants to work, while still alerting developers to potentially problematic usage.
1 parent 6c860b9 commit aca5a52

7 files changed

+40
-32
lines changed

compiler/plc_diagnostics/src/diagnostics/diagnostics_registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ lazy_static! {
141141
E037, Error, include_str!("./error_codes/E037.md"),
142142
E038, Error, include_str!("./error_codes/E038.md"), // Missing type
143143
E039, Warning, include_str!("./error_codes/E039.md"),
144-
E040, Error, include_str!("./error_codes/E040.md"),
144+
E040, Warning, include_str!("./error_codes/E040.md"),
145145
E041, Error, include_str!("./error_codes/E041.md"),
146146
E042, Warning, include_str!("./error_codes/E042.md"), // Assignment to reference
147147
E043, Error, include_str!("./error_codes/E043.md"),
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
# Invalid Enum Variant
1+
# Non-Standard Enum Variant
22

3-
This error indicates the right-hand side in an enum assignment is invalid.
4-
For example an enum such as `TYPE Color : (red := 0, green := 1, blue := 2); END_TYPE` can only take values
3+
This warning indicates the right-hand side in an enum assignment does not match a defined variant.
4+
For example an enum such as `TYPE Color : (red := 0, green := 1, blue := 2); END_TYPE` is expected to take values
55
which (internally) yield a literal integer 0, 1 or 2.

src/validation/statement.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ pub(crate) fn validate_enum_variant_assignment<T: AnnotationMap>(
12661266
None => {
12671267
validator.push_diagnostic(
12681268
Diagnostic::new(format!(
1269-
"Invalid enum value `{}` for `{}`",
1269+
"Non-standard enum value `{}` for `{}`",
12701270
validator.context.slice(&right.location),
12711271
validator.get_type_name_or_slice(left_dt)
12721272
))

src/validation/tests/enum_validation_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ fn enum_variants_mismatch() {
1212
PROGRAM main
1313
VAR
1414
color : (red := 0, green := 1, blue := 2);
15-
localState : State;
15+
localState : State := 99;
1616
1717
validReferenceForEnum : DINT := 0;
1818
invalidReferenceForEnum : DINT := 99; // ...problems but a ~~bi-~~ validation ain't one
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
---
22
source: src/validation/tests/enum_validation_test.rs
33
expression: diagnostics
4+
snapshot_kind: text
45
---
5-
error[E040]: Invalid enum value `1000` for `Color`
6+
warning[E040]: Non-standard enum value `1000` for `Color`
67
┌─ <internal>:7:24
78
89
2 │ TYPE Color : (red, green, blue, yellow, cyan, orange, purple, violet); END_TYPE
910
│ ----- see also
1011
·
1112
7 │ myColor := 1000;
12-
│ ^^^^ Invalid enum value `1000` for `Color`
13-
14-
13+
│ ^^^^ Non-standard enum value `1000` for `Color`

src/validation/tests/snapshots/rusty__validation__tests__enum_validation_test__enum_variants_mismatch.snap

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
---
22
source: src/validation/tests/enum_validation_test.rs
33
expression: diagnostics
4+
snapshot_kind: text
45
---
6+
warning[E040]: Non-standard enum value `99` for `State`
7+
┌─ <internal>:9:44
8+
9+
2 │ TYPE State : (Idle := 0, Working := 100); END_TYPE
10+
│ ----- see also
11+
·
12+
9 │ localState : State := 99;
13+
│ ^^ Non-standard enum value `99` for `State`
14+
515
note[E092]: Replace `0` with `Idle`
616
┌─ <internal>:18:31
717
@@ -83,32 +93,32 @@ note[E092]: Replace `validReferenceForEnum` with `Idle`
8393
32 │ localState := validReferenceForEnum;
8494
│ ^^^^^^^^^^^^^^^^^^^^^ Replace `validReferenceForEnum` with `Idle`
8595

86-
error[E040]: Invalid enum value `99` for `(red := 0, green := 1, blue := 2)`
96+
warning[E040]: Non-standard enum value `99` for `(red := 0, green := 1, blue := 2)`
8797
┌─ <internal>:38:26
8898
8999
8 │ color : (red := 0, green := 1, blue := 2);
90100
│ --------------------------------- see also
91101
·
92102
38 │ color := 99;
93-
│ ^^ Invalid enum value `99` for `(red := 0, green := 1, blue := 2)`
103+
│ ^^ Non-standard enum value `99` for `(red := 0, green := 1, blue := 2)`
94104

95-
error[E040]: Invalid enum value `State.Working` for `(red := 0, green := 1, blue := 2)`
105+
warning[E040]: Non-standard enum value `State.Working` for `(red := 0, green := 1, blue := 2)`
96106
┌─ <internal>:39:26
97107
98108
8 │ color : (red := 0, green := 1, blue := 2);
99109
│ --------------------------------- see also
100110
·
101111
39 │ color := State.Working;
102-
│ ^^^^^^^^^^^^^ Invalid enum value `State.Working` for `(red := 0, green := 1, blue := 2)`
112+
│ ^^^^^^^^^^^^^ Non-standard enum value `State.Working` for `(red := 0, green := 1, blue := 2)`
103113

104-
error[E040]: Invalid enum value `invalidReferenceForEnum` for `(red := 0, green := 1, blue := 2)`
114+
warning[E040]: Non-standard enum value `invalidReferenceForEnum` for `(red := 0, green := 1, blue := 2)`
105115
┌─ <internal>:40:26
106116
107117
8 │ color : (red := 0, green := 1, blue := 2);
108118
│ --------------------------------- see also
109119
·
110120
40 │ color := invalidReferenceForEnum;
111-
│ ^^^^^^^^^^^^^^^^^^^^^^^ Invalid enum value `invalidReferenceForEnum` for `(red := 0, green := 1, blue := 2)`
121+
│ ^^^^^^^^^^^^^^^^^^^^^^^ Non-standard enum value `invalidReferenceForEnum` for `(red := 0, green := 1, blue := 2)`
112122

113123
warning[E091]: Value evaluated at run-time, use an enum variant from `(red := 0, green := 1, blue := 2)`
114124
┌─ <internal>:41:26
@@ -119,38 +129,38 @@ warning[E091]: Value evaluated at run-time, use an enum variant from `(red := 0,
119129
41 │ color := foo(); // Value of `foo()` unknown, might be outside of variants range
120130
│ ^^^^^^ Value evaluated at run-time, use an enum variant from `(red := 0, green := 1, blue := 2)`
121131

122-
error[E040]: Invalid enum value `99` for `State`
132+
warning[E040]: Non-standard enum value `99` for `State`
123133
┌─ <internal>:43:31
124134
125135
2 │ TYPE State : (Idle := 0, Working := 100); END_TYPE
126136
│ ----- see also
127137
·
128138
43 │ localState := 99;
129-
│ ^^ Invalid enum value `99` for `State`
139+
│ ^^ Non-standard enum value `99` for `State`
130140

131-
error[E040]: Invalid enum value `green` for `State`
141+
warning[E040]: Non-standard enum value `green` for `State`
132142
┌─ <internal>:44:31
133143
134144
2 │ TYPE State : (Idle := 0, Working := 100); END_TYPE
135145
│ ----- see also
136146
·
137147
44 │ localState := green;
138-
│ ^^^^^ Invalid enum value `green` for `State`
148+
│ ^^^^^ Non-standard enum value `green` for `State`
139149

140-
error[E040]: Invalid enum value `blue` for `State`
150+
warning[E040]: Non-standard enum value `blue` for `State`
141151
┌─ <internal>:45:31
142152
143153
2 │ TYPE State : (Idle := 0, Working := 100); END_TYPE
144154
│ ----- see also
145155
·
146156
45 │ localState := blue;
147-
│ ^^^^ Invalid enum value `blue` for `State`
157+
│ ^^^^ Non-standard enum value `blue` for `State`
148158

149-
error[E040]: Invalid enum value `invalidReferenceForEnum` for `State`
159+
warning[E040]: Non-standard enum value `invalidReferenceForEnum` for `State`
150160
┌─ <internal>:46:31
151161
152162
2 │ TYPE State : (Idle := 0, Working := 100); END_TYPE
153163
│ ----- see also
154164
·
155165
46 │ localState := invalidReferenceForEnum;
156-
│ ^^^^^^^^^^^^^^^^^^^^^^^ Invalid enum value `invalidReferenceForEnum` for `State`
166+
│ ^^^^^^^^^^^^^^^^^^^^^^^ Non-standard enum value `invalidReferenceForEnum` for `State`
Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
---
22
source: src/validation/tests/enum_validation_test.rs
33
expression: diagnostics
4+
snapshot_kind: text
45
---
5-
error[E040]: Invalid enum value `red` for `(metallic := 1, matte := 2, neon := 3) := red`
6+
warning[E040]: Non-standard enum value `red` for `(metallic := 1, matte := 2, neon := 3) := red`
67
┌─ <internal>:7:63
78
89
7 │ y : (metallic := 1, matte := 2, neon := 3) := red; // error
910
│ ------------------------------------------^^^
1011
│ │ │
11-
│ │ Invalid enum value `red` for `(metallic := 1, matte := 2, neon := 3) := red`
12+
│ │ Non-standard enum value `red` for `(metallic := 1, matte := 2, neon := 3) := red`
1213
│ see also
1314

1415
note[E092]: Replace `yellow` with `x1`
@@ -20,22 +21,22 @@ note[E092]: Replace `yellow` with `x1`
2021
│ │ Replace `yellow` with `x1`
2122
│ see also
2223

23-
error[E040]: Invalid enum value `neon` for `(x5, x6, x7) := neon`
24+
warning[E040]: Non-standard enum value `neon` for `(x5, x6, x7) := neon`
2425
┌─ <internal>:11:40
2526
2627
11 │ var2 : (x5, x6, x7) := neon; // error
2728
│ ----------------^^^^
2829
│ │ │
29-
│ │ Invalid enum value `neon` for `(x5, x6, x7) := neon`
30+
│ │ Non-standard enum value `neon` for `(x5, x6, x7) := neon`
3031
│ see also
3132

32-
error[E040]: Invalid enum value `7` for `(a, b, c) := 7`
33+
warning[E040]: Non-standard enum value `7` for `(a, b, c) := 7`
3334
┌─ <internal>:12:37
3435
3536
12 │ var3 : (a, b, c) := 7; // error
3637
│ -------------^
3738
│ │ │
38-
│ │ Invalid enum value `7` for `(a, b, c) := 7`
39+
│ │ Non-standard enum value `7` for `(a, b, c) := 7`
3940
│ see also
4041

4142
note[E092]: Replace `2` with `green`
@@ -46,5 +47,3 @@ note[E092]: Replace `2` with `green`
4647
│ │ │
4748
│ │ Replace `2` with `green`
4849
│ see also
49-
50-

0 commit comments

Comments
 (0)