Check type for forward reference definition
authorRenato Golin <rengolin@microsoft.com>
Tue, 5 May 2020 09:03:26 +0000 (10:03 +0100)
committerRenato Golin <rengolin@microsoft.com>
Wed, 6 May 2020 13:34:18 +0000 (14:34 +0100)
The types of forward references are checked that they match with other
uses, but they do not check they match with the definition.

    func @forward_reference_type_check() -> (i8) {
      br ^bb2

    ^bb1:
      return %1 : i8

    ^bb2:
      %1 = "bar"() : () -> (f32)
      br ^bb1
    }

Would be parsed and the use site of '%1' would be silently changed to
'f32'.

This commit adds a test for this case, and a check during parsing for
the types to match.

Patch by Matthew Parkinson <mattpark@microsoft.com>

Closes D79317.

mlir/lib/Parser/Parser.cpp
mlir/test/IR/invalid.mlir

index 384c69e..ebac3e2 100644 (file)
@@ -3625,6 +3625,14 @@ ParseResult OperationParser::addDefinition(SSAUseInfo useInfo, Value value) {
           .append("previously defined here");
     }
 
+    if (existing.getType() != value.getType()) {
+      return emitError(useInfo.loc)
+          .append("definition of SSA value '", useInfo.name, "#",
+                  useInfo.number, "' has type ", value.getType())
+          .attachNote(getEncodedSourceLocation(entries[useInfo.number].second))
+          .append("previously used here with type ", existing.getType());
+    }
+
     // If it was a forward reference, update everything that used it to use
     // the actual definition instead, delete the forward ref, and remove it
     // from our set of forward references we track.
index 926c2e3..47fd0b7 100644 (file)
@@ -1512,3 +1512,18 @@ func @duplicate_dictionary_attr_key() {
   // expected-error @+1 {{duplicate key in dictionary attribute}}
   "foo.op"() {a, a} : () -> ()
 }
+
+// -----
+
+func @forward_reference_type_check() -> (i8) {
+  br ^bb2
+
+^bb1:
+  // expected-note @+1 {{previously used here with type 'i8'}}
+  return %1 : i8
+
+^bb2:
+  // expected-error @+1 {{definition of SSA value '%1#0' has type 'f32'}}
+  %1 = "bar"() : () -> (f32)
+  br ^bb1
+}