It may be necessary for interface methods to process or return variables with the interface class type, in particular for attribute and type interfaces that can return modified attributes and types that implement the same interface. However, the code generated by ODS in this case would not compile because the signature (and the body if provided) appear in the definition of the Model class and before the interface class, which derives from the Model. Change the ODS interface method generator to emit only method declarations in the Model class itself, and emit method definitions after the interface class. Mark as "inline" since their definitions are still emitted in the header and are no longer implicitly inline. Add a forward declaration of the interface class before the Concept+Model classes to make the class name usable in declarations. Reviewed By: rriddle Differential Revision: https://reviews.llvm.org/D91499
49 lines
1.6 KiB
C++
49 lines
1.6 KiB
C++
//===- TestInterfaces.cpp - Test interface generation and application -----===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "TestTypes.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::test;
|
|
|
|
namespace {
|
|
/// This test checks various aspects of Type interface generation and
|
|
/// application.
|
|
struct TestTypeInterfaces
|
|
: public PassWrapper<TestTypeInterfaces, OperationPass<ModuleOp>> {
|
|
void runOnOperation() override {
|
|
getOperation().walk([](Operation *op) {
|
|
for (Type type : op->getResultTypes()) {
|
|
if (auto testInterface = type.dyn_cast<TestTypeInterface>()) {
|
|
testInterface.printTypeA(op->getLoc());
|
|
testInterface.printTypeB(op->getLoc());
|
|
testInterface.printTypeC(op->getLoc());
|
|
testInterface.printTypeD(op->getLoc());
|
|
// Just check that we can assign the result to a variable of interface
|
|
// type.
|
|
TestTypeInterface result = testInterface.printTypeRet(op->getLoc());
|
|
(void)result;
|
|
}
|
|
if (auto testType = type.dyn_cast<TestType>())
|
|
testType.printTypeE(op->getLoc());
|
|
}
|
|
});
|
|
}
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
namespace mlir {
|
|
namespace test {
|
|
void registerTestInterfaces() {
|
|
PassRegistration<TestTypeInterfaces> pass("test-type-interfaces",
|
|
"Test type interface support.");
|
|
}
|
|
} // namespace test
|
|
} // namespace mlir
|