Skip to content

Commit 2ef054f

Browse files
authored
Merge pull request #506 from OpenVADL/fix-missing-enoding-crash
ast: Fix crash when undefined symbol is used in encoding
2 parents c288023 + 470cca8 commit 2ef054f

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

vadl/main/vadl/ast/Definition.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,10 @@ public FormatDefinition(IdentifierOrPlaceholder identifier, TypeLiteral typeLite
747747
this.loc = location;
748748
}
749749

750+
boolean hasField(String name) {
751+
return fields.stream().anyMatch(f -> f.identifier().name.equals(name));
752+
}
753+
750754
FormatField getField(String name) {
751755
return fields.stream().filter(f -> f.identifier().name.equals(name)).findFirst().orElseThrow();
752756
}

vadl/main/vadl/ast/SymbolTable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,7 @@ public Void visit(EncodingDefinition definition) {
10911091

10921092
// Verify that the field specified really is a field in the encoding
10931093
var field = fieldEncoding.field;
1094-
if (format.getField(field.name) == null) {
1094+
if (!format.hasField(field.name)) {
10951095
var suggestions = Levenshtein.suggestions(
10961096
field.name,
10971097
format.fields.stream().map(f -> f.identifier().name).toList());

vadl/test/vadl/ast/NameResolutionTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,24 @@ void registersAvailableInInstruction() {
166166
Assertions.assertDoesNotThrow(() -> VadlParser.parse(prog), "Cannot parse input");
167167
}
168168

169+
@Test
170+
void unknownFieldInEcoding() {
171+
// https://github.com/OpenVADL/openvadl/issues/478
172+
var prog = """
173+
instruction set architecture ISA = {
174+
register X : Bits<32>
175+
format Btype : Bits<32> = {
176+
bits [31..0]
177+
}
178+
instruction BEQ : Btype = { X := 0 }
179+
encoding BEQ = { bit = 8 }
180+
}
181+
""";
182+
var error = Assertions.assertThrows(DiagnosticList.class, () -> VadlParser.parse(prog),
183+
"Should reject typos");
184+
Assertions.assertEquals("Unknown Field: \"bit\"", error.items.getFirst().reason);
185+
}
186+
169187
@Test
170188
void formatFieldsAvailableInInstruction() {
171189
var prog = """

0 commit comments

Comments
 (0)