// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file -verify-diagnostics | FileCheck %s // Verify that extensible dialects can register dynamic operations and types. //===----------------------------------------------------------------------===// // Dynamic type //===----------------------------------------------------------------------===// // CHECK-LABEL: func @succeededDynamicTypeVerifier func.func @succeededDynamicTypeVerifier() { // CHECK: %{{.*}} = "unregistered_op"() : () -> !test.dynamic_singleton "unregistered_op"() : () -> !test.dynamic_singleton // CHECK-NEXT: "unregistered_op"() : () -> !test.dynamic_pair "unregistered_op"() : () -> !test.dynamic_pair // CHECK-NEXT: %{{.*}} = "unregistered_op"() : () -> !test.dynamic_pair, !test.dynamic_singleton> "unregistered_op"() : () -> !test.dynamic_pair, !test.dynamic_singleton> return } // ----- func.func @failedDynamicTypeVerifier() { // expected-error@+1 {{expected 0 type arguments, but had 1}} "unregistered_op"() : () -> !test.dynamic_singleton return } // ----- func.func @failedDynamicTypeVerifier2() { // expected-error@+1 {{expected 2 type arguments, but had 1}} "unregistered_op"() : () -> !test.dynamic_pair return } // ----- // CHECK-LABEL: func @customTypeParserPrinter func.func @customTypeParserPrinter() { // CHECK: "unregistered_op"() : () -> !test.dynamic_custom_assembly_format "unregistered_op"() : () -> !test.dynamic_custom_assembly_format return } // ----- //===----------------------------------------------------------------------===// // Dynamic attribute //===----------------------------------------------------------------------===// // CHECK-LABEL: func @succeededDynamicAttributeVerifier func.func @succeededDynamicAttributeVerifier() { // CHECK: "unregistered_op"() {test_attr = #test.dynamic_singleton} : () -> () "unregistered_op"() {test_attr = #test.dynamic_singleton} : () -> () // CHECK-NEXT: "unregistered_op"() {test_attr = #test.dynamic_pair<3 : i32, 5 : i32>} : () -> () "unregistered_op"() {test_attr = #test.dynamic_pair<3 : i32, 5 : i32>} : () -> () // CHECK-NEXT: "unregistered_op"() {test_attr = #test.dynamic_pair<#test.dynamic_pair<3 : i32, 5 : i32>, f64>} : () -> () "unregistered_op"() {test_attr = #test.dynamic_pair<#test.dynamic_pair<3 : i32, 5 : i32>, f64>} : () -> () return } // ----- func.func @failedDynamicAttributeVerifier() { // expected-error@+1 {{expected 0 attribute arguments, but had 1}} "unregistered_op"() {test_attr = #test.dynamic_singleton} : () -> () return } // ----- func.func @failedDynamicAttributeVerifier2() { // expected-error@+1 {{expected 2 attribute arguments, but had 1}} "unregistered_op"() {test_attr = #test.dynamic_pair} : () -> () return } // ----- // CHECK-LABEL: func @customAttributeParserPrinter func.func @customAttributeParserPrinter() { // CHECK: "unregistered_op"() {test_attr = #test.dynamic_custom_assembly_format} : () -> () "unregistered_op"() {test_attr = #test.dynamic_custom_assembly_format} : () -> () return } //===----------------------------------------------------------------------===// // Dynamic op //===----------------------------------------------------------------------===// // ----- // CHECK-LABEL: func @succeededDynamicOpVerifier func.func @succeededDynamicOpVerifier(%a: f32) { // CHECK: "test.dynamic_generic"() : () -> () // CHECK-NEXT: %{{.*}} = "test.dynamic_generic"(%{{.*}}) : (f32) -> f64 // CHECK-NEXT: %{{.*}}:2 = "test.dynamic_one_operand_two_results"(%{{.*}}) : (f32) -> (f64, f64) "test.dynamic_generic"() : () -> () "test.dynamic_generic"(%a) : (f32) -> f64 "test.dynamic_one_operand_two_results"(%a) : (f32) -> (f64, f64) return } // ----- func.func @failedDynamicOpVerifier() { // expected-error@+1 {{expected 1 operand, but had 0}} "test.dynamic_one_operand_two_results"() : () -> (f64, f64) return } // ----- func.func @failedDynamicOpVerifier2(%a: f32) { // expected-error@+1 {{expected 2 results, but had 0}} "test.dynamic_one_operand_two_results"(%a) : (f32) -> () return } // ----- // CHECK-LABEL: func @customOpParserPrinter func.func @customOpParserPrinter() { // CHECK: test.dynamic_custom_parser_printer custom_keyword test.dynamic_custom_parser_printer custom_keyword return } //===----------------------------------------------------------------------===// // Dynamic dialect //===----------------------------------------------------------------------===// // ----- // Check that the verifier of a dynamic operation in a dynamic dialect // can fail. This shows that the dialect is correctly registered. func.func @failedDynamicDialectOpVerifier() { // expected-error@+1 {{expected a single result, no operands and no regions}} "test_dyn.one_result"() : () -> () return }