@@ -40,6 +40,7 @@ class Instruction(parser.InstDef):
40
40
41
41
def __init__ (self , inst : parser .InstDef ):
42
42
super ().__init__ (inst .header , inst .block )
43
+ self .context = inst .context
43
44
self .always_exits = always_exits (self .block )
44
45
self .cache_effects = [
45
46
effect for effect in self .inputs if isinstance (effect , parser .CacheEffect )
@@ -50,6 +51,18 @@ def __init__(self, inst: parser.InstDef):
50
51
]
51
52
self .output_effects = self .outputs # For consistency/completeness
52
53
54
+ def check_overlaps (self , psr : parser .Parser ) -> None :
55
+ for i , inp in enumerate (self .input_effects ):
56
+ for j , outp in enumerate (self .output_effects ):
57
+ if inp .name == outp .name and inp .name != "unused" :
58
+ if i != j :
59
+ tkn = psr .tokens [ctx .begin ] if (ctx := self .context ) else None
60
+ raise psr .make_syntax_error (
61
+ f"Input { inp .name !r} at pos { i } repeated in output at different pos { j } " ,
62
+ tkn ,
63
+ )
64
+ break
65
+
53
66
def write (
54
67
self , f : typing .TextIO , indent : str , dedent : int = 0
55
68
) -> None :
@@ -182,7 +195,8 @@ def parse(self) -> None:
182
195
self .families = {}
183
196
while (tkn := psr .peek (raw = True )) and tkn .text != END_MARKER :
184
197
if inst := psr .inst_def ():
185
- self .instrs [inst .name ] = Instruction (inst )
198
+ self .instrs [inst .name ] = instr = Instruction (inst )
199
+ instr .check_overlaps (psr )
186
200
elif super := psr .super_def ():
187
201
self .supers [super .name ] = super
188
202
elif family := psr .family_def ():
0 commit comments