[mlir][Parser] Fix crash in DenseElementsAttr parser when no elements are parsed
authorRiver Riddle <riddleriver@gmail.com>
Thu, 10 Dec 2020 20:44:35 +0000 (12:44 -0800)
committerRiver Riddle <riddleriver@gmail.com>
Thu, 10 Dec 2020 20:48:37 +0000 (12:48 -0800)
This fixes a crash when no elements are parsed, but the type expects at least one.

Fixes PR#47763

Differential Revision: https://reviews.llvm.org/D92982

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

index 2e385cf..e78237e 100644 (file)
@@ -531,6 +531,13 @@ DenseElementsAttr TensorLiteralParser::getAttr(llvm::SMLoc loc,
     return nullptr;
   }
 
+  // Handle the case where no elements were parsed.
+  if (!hexStorage.hasValue() && storage.empty() && type.getNumElements()) {
+    p.emitError(loc) << "parsed zero elements, but type (" << type
+                     << ") expected at least 1";
+    return nullptr;
+  }
+
   // Handle complex types in the specific element type cases below.
   bool isComplex = false;
   if (ComplexType complexTy = eltType.dyn_cast<ComplexType>()) {
index 4930341..6b28b33 100644 (file)
@@ -687,6 +687,11 @@ func @elementsattr_toolarge1() -> () {
 
 // -----
 
+// expected-error@+1 {{parsed zero elements, but type ('tensor<i64>') expected at least 1}}
+#attr = dense<> : tensor<i64>
+
+// -----
+
 func @elementsattr_toolarge2() -> () {
 ^bb0:
   "foo"(){bar = dense<[-777]> : tensor<1xi8>} : () -> () // expected-error {{integer constant out of range}}