173440ca9SMarkus Böck //===- InterfaceTest.cpp - Test interfaces --------------------------------===//
273440ca9SMarkus Böck //
373440ca9SMarkus Böck // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473440ca9SMarkus Böck // See https://llvm.org/LICENSE.txt for license information.
573440ca9SMarkus Böck // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673440ca9SMarkus Böck //
773440ca9SMarkus Böck //===----------------------------------------------------------------------===//
873440ca9SMarkus Böck
973440ca9SMarkus Böck #include "mlir/IR/BuiltinAttributes.h"
1073440ca9SMarkus Böck #include "mlir/IR/BuiltinDialect.h"
1173440ca9SMarkus Böck #include "mlir/IR/BuiltinOps.h"
1273440ca9SMarkus Böck #include "mlir/IR/BuiltinTypes.h"
1373440ca9SMarkus Böck #include "mlir/IR/OwningOpRef.h"
1473440ca9SMarkus Böck #include "gtest/gtest.h"
1573440ca9SMarkus Böck
1673440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestAttributes.h"
1773440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestDialect.h"
18*e95e94adSJeff Niu #include "../../test/lib/Dialect/Test/TestOps.h"
1973440ca9SMarkus Böck #include "../../test/lib/Dialect/Test/TestTypes.h"
2073440ca9SMarkus Böck
2173440ca9SMarkus Böck using namespace mlir;
2273440ca9SMarkus Böck using namespace test;
2373440ca9SMarkus Böck
TEST(InterfaceTest,OpInterfaceDenseMapKey)2473440ca9SMarkus Böck TEST(InterfaceTest, OpInterfaceDenseMapKey) {
2573440ca9SMarkus Böck MLIRContext context;
2673440ca9SMarkus Böck context.loadDialect<test::TestDialect>();
2773440ca9SMarkus Böck
2873440ca9SMarkus Böck OwningOpRef<ModuleOp> module = ModuleOp::create(UnknownLoc::get(&context));
2973440ca9SMarkus Böck OpBuilder builder(module->getBody(), module->getBody()->begin());
3073440ca9SMarkus Böck auto op1 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3173440ca9SMarkus Böck builder.getI32Type());
3273440ca9SMarkus Böck auto op2 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3373440ca9SMarkus Böck builder.getI32Type());
3473440ca9SMarkus Böck auto op3 = builder.create<test::SideEffectOp>(builder.getUnknownLoc(),
3573440ca9SMarkus Böck builder.getI32Type());
3673440ca9SMarkus Böck DenseSet<MemoryEffectOpInterface> opSet;
3773440ca9SMarkus Böck opSet.insert(op1);
3873440ca9SMarkus Böck opSet.insert(op2);
3973440ca9SMarkus Böck opSet.erase(op1);
4073440ca9SMarkus Böck EXPECT_FALSE(opSet.contains(op1));
4173440ca9SMarkus Böck EXPECT_TRUE(opSet.contains(op2));
4273440ca9SMarkus Böck EXPECT_FALSE(opSet.contains(op3));
4373440ca9SMarkus Böck }
4473440ca9SMarkus Böck
TEST(InterfaceTest,TypeInterfaceDenseMapKey)4573440ca9SMarkus Böck TEST(InterfaceTest, TypeInterfaceDenseMapKey) {
4673440ca9SMarkus Böck MLIRContext context;
4773440ca9SMarkus Böck context.loadDialect<test::TestDialect>();
4873440ca9SMarkus Böck
4973440ca9SMarkus Böck OpBuilder builder(&context);
5073440ca9SMarkus Böck DenseSet<DataLayoutTypeInterface> typeSet;
5173440ca9SMarkus Böck auto type1 = builder.getType<test::TestTypeWithLayoutType>(1);
5273440ca9SMarkus Böck auto type2 = builder.getType<test::TestTypeWithLayoutType>(2);
5373440ca9SMarkus Böck auto type3 = builder.getType<test::TestTypeWithLayoutType>(3);
5473440ca9SMarkus Böck typeSet.insert(type1);
5573440ca9SMarkus Böck typeSet.insert(type2);
5673440ca9SMarkus Böck typeSet.erase(type1);
5773440ca9SMarkus Böck EXPECT_FALSE(typeSet.contains(type1));
5873440ca9SMarkus Böck EXPECT_TRUE(typeSet.contains(type2));
5973440ca9SMarkus Böck EXPECT_FALSE(typeSet.contains(type3));
6073440ca9SMarkus Böck }
61edae8f6cSMarkus Böck
TEST(InterfaceTest,TestCustomClassOf)62edae8f6cSMarkus Böck TEST(InterfaceTest, TestCustomClassOf) {
63edae8f6cSMarkus Böck MLIRContext context;
64edae8f6cSMarkus Böck context.loadDialect<test::TestDialect>();
65edae8f6cSMarkus Böck
66edae8f6cSMarkus Böck OpBuilder builder(&context);
67edae8f6cSMarkus Böck auto op = builder.create<TestOpOptionallyImplementingInterface>(
68edae8f6cSMarkus Böck builder.getUnknownLoc(), /*implementsInterface=*/true);
69edae8f6cSMarkus Böck EXPECT_TRUE(isa<TestOptionallyImplementedOpInterface>(*op));
70edae8f6cSMarkus Böck op.setImplementsInterface(false);
71edae8f6cSMarkus Böck EXPECT_FALSE(isa<TestOptionallyImplementedOpInterface>(*op));
7242db67c3SChristian Sigg op.erase();
73edae8f6cSMarkus Böck }
74cedeb31eSMarkus Böck
TEST(InterfaceTest,TestImplicitConversion)75cedeb31eSMarkus Böck TEST(InterfaceTest, TestImplicitConversion) {
76cedeb31eSMarkus Böck MLIRContext context;
77cedeb31eSMarkus Böck context.loadDialect<test::TestDialect>();
78cedeb31eSMarkus Böck
79cedeb31eSMarkus Böck TestBaseTypeInterfacePrintTypeB typeB;
80cedeb31eSMarkus Böck TestBaseTypeInterfacePrintTypeA typeA = typeB;
81cedeb31eSMarkus Böck EXPECT_EQ(typeA, nullptr);
82cedeb31eSMarkus Böck
83cedeb31eSMarkus Böck typeB = TestType::get(&context);
84cedeb31eSMarkus Böck typeA = typeB;
85cedeb31eSMarkus Böck EXPECT_EQ(typeA, typeB);
86cedeb31eSMarkus Böck }
87