-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[clang-tidy][mlir] Expand to cover pointer of builder #159423
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Previously this only checked for OpBuilder usage, but it could also be invoked via pointer. Also change how call range is calculated to avoid false overlaps which limits rewriting builder calls inside arguments of builder calls.
|
@llvm/pr-subscribers-clang-tidy Author: Jacques Pienaar (jpienaar) ChangesPreviously this only checked for OpBuilder usage, but it could also be invoked via pointer. Also change how call range is calculated to avoid false overlaps which limits rewriting builder calls inside arguments of builder calls. Full diff: https://github.com/llvm/llvm-project/pull/159423.diff 2 Files Affected:
diff --git a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
index 0d81b9a9e38ca..8705c10f5c646 100644
--- a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
+++ b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
@@ -23,13 +23,11 @@ namespace {
using namespace ::clang::ast_matchers;
using namespace ::clang::transformer;
-EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
- RangeSelector CallArgs) {
+EditGenerator rewrite(RangeSelector Call, RangeSelector Builder) {
// This is using an EditGenerator rather than ASTEdit as we want to warn even
// if in macro.
- return [Call = std::move(Call), Builder = std::move(Builder),
- CallArgs =
- std::move(CallArgs)](const MatchFinder::MatchResult &Result)
+ return [Call = std::move(Call),
+ Builder = std::move(Builder)](const MatchFinder::MatchResult &Result)
-> Expected<SmallVector<transformer::Edit, 1>> {
Expected<CharSourceRange> CallRange = Call(Result);
if (!CallRange)
@@ -54,7 +52,7 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
auto NextToken = [&](std::optional<Token> CurrentToken) {
if (!CurrentToken)
return CurrentToken;
- if (CurrentToken->getEndLoc() >= CallRange->getEnd())
+ if (CurrentToken->is(clang::tok::eof))
return std::optional<Token>();
return clang::Lexer::findNextToken(CurrentToken->getLocation(), SM,
LangOpts);
@@ -68,9 +66,10 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
"missing '<' token");
}
+
std::optional<Token> EndToken = NextToken(LessToken);
- for (std::optional<Token> GreaterToken = NextToken(EndToken);
- GreaterToken && GreaterToken->getKind() != clang::tok::greater;
+ std::optional<Token> GreaterToken = NextToken(EndToken);
+ for (; GreaterToken && GreaterToken->getKind() != clang::tok::greater;
GreaterToken = NextToken(GreaterToken)) {
EndToken = GreaterToken;
}
@@ -79,12 +78,21 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
"missing '>' token");
}
+ std::optional<Token> ArgStart = NextToken(GreaterToken);
+ if (!ArgStart || ArgStart->getKind() != clang::tok::l_paren) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "missing '(' token");
+ }
+ std::optional<Token> Arg = NextToken(ArgStart);
+ if (!Arg) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "unexpected end of file");
+ }
+ bool hasArgs = Arg->getKind() != clang::tok::r_paren;
+
Expected<CharSourceRange> BuilderRange = Builder(Result);
if (!BuilderRange)
return BuilderRange.takeError();
- Expected<CharSourceRange> CallArgsRange = CallArgs(Result);
- if (!CallArgsRange)
- return CallArgsRange.takeError();
// Helper for concatting below.
auto GetText = [&](const CharSourceRange &Range) {
@@ -93,18 +101,19 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
Edit Replace;
Replace.Kind = EditKind::Range;
- Replace.Range = *CallRange;
- std::string CallArgsStr;
- // Only emit args if there are any.
- if (auto CallArgsText = GetText(*CallArgsRange).ltrim();
- !CallArgsText.rtrim().empty()) {
- CallArgsStr = llvm::formatv(", {}", CallArgsText);
+ Replace.Range.setBegin(CallRange->getBegin());
+ Replace.Range.setEnd(ArgStart->getEndLoc());
+ const Expr *BuilderExpr = Result.Nodes.getNodeAs<Expr>("builder");
+ std::string BuilderText = GetText(*BuilderRange).str();
+ if (BuilderExpr->getType()->isPointerType()) {
+ BuilderText = BuilderExpr->isImplicitCXXThis()
+ ? "*this"
+ : llvm::formatv("*{}", BuilderText).str();
}
- Replace.Replacement =
- llvm::formatv("{}::create({}{})",
- GetText(CharSourceRange::getTokenRange(
- LessToken->getEndLoc(), EndToken->getLastLoc())),
- GetText(*BuilderRange), CallArgsStr);
+ StringRef OpType = GetText(CharSourceRange::getTokenRange(
+ LessToken->getEndLoc(), EndToken->getLastLoc()));
+ Replace.Replacement = llvm::formatv("{}::create({}{}", OpType, BuilderText,
+ hasArgs ? ", " : "");
return SmallVector<Edit, 1>({Replace});
};
@@ -114,19 +123,17 @@ RewriteRuleWith<std::string> useNewMlirOpBuilderCheckRule() {
Stencil message = cat("use 'OpType::create(builder, ...)' instead of "
"'builder.create<OpType>(...)'");
// Match a create call on an OpBuilder.
- ast_matchers::internal::Matcher<Stmt> base =
- cxxMemberCallExpr(
- on(expr(hasType(
- cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"))))
- .bind("builder")),
- callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))),
- callee(cxxMethodDecl(hasName("create"))))
- .bind("call");
+ auto BuilderType = cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"));
+ ast_matchers::internal::Matcher<Stmt> base = cxxMemberCallExpr(
+ on(expr(anyOf(hasType(BuilderType), hasType(pointsTo(BuilderType))))
+ .bind("builder")),
+ callee(expr().bind("call")),
+ callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))),
+ callee(cxxMethodDecl(hasName("create"))));
return applyFirst(
// Attempt rewrite given an lvalue builder, else just warn.
{makeRule(cxxMemberCallExpr(unless(on(cxxTemporaryObjectExpr())), base),
- rewrite(node("call"), node("builder"), callArgs("call")),
- message),
+ rewrite(node("call"), node("builder")), message),
makeRule(base, noopEdit(node("call")), message)});
}
} // namespace
diff --git a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
index 0971a1611e3cb..1fbbf0a76c42a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
@@ -2,6 +2,7 @@
namespace mlir {
class Location {};
+class Value {};
class OpBuilder {
public:
template <typename OpTy, typename... Args>
@@ -28,6 +29,13 @@ struct NamedOp {
static NamedOp create(OpBuilder &builder, Location location, const char* name) {
return NamedOp(name);
}
+ Value getResult() { return Value(); }
+};
+struct OperandOp {
+ OperandOp(Value val) {}
+ static OperandOp create(OpBuilder &builder, Location location, Value val) {
+ return OperandOp(val);
+ }
};
} // namespace mlir
@@ -40,6 +48,15 @@ void g(mlir::OpBuilder &b) {
b.create<T>(b.getUnknownLoc(), "gaz");
}
+class CustomBuilder : public mlir::ImplicitLocOpBuilder {
+public:
+ mlir::NamedOp f(const char *name) {
+ // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: NamedOp::create(*this, name);
+ return create<mlir::NamedOp>(name);
+ }
+};
+
void f() {
mlir::OpBuilder builder;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
@@ -47,6 +64,8 @@ void f() {
builder.create<mlir:: ModuleOp>(builder.getUnknownLoc());
using mlir::NamedOp;
+ using mlir::OperandOp;
+
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "baz")
builder.create<NamedOp>(builder.getUnknownLoc(), "baz");
@@ -56,7 +75,7 @@ void f() {
// CHECK-FIXES: builder.getUnknownLoc(),
// CHECK-FIXES: "caz")
builder.
- create<NamedOp>(
+ create<NamedOp> (
builder.getUnknownLoc(),
"caz");
@@ -67,10 +86,25 @@ void f() {
mlir::ImplicitLocOpBuilder ib;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
- // CHECK-FIXES: mlir::ModuleOp::create(ib)
+ // CHECK-FIXES: mlir::ModuleOp::create(ib )
ib.create<mlir::ModuleOp>( );
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
+
+ auto *p = &builder;
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: NamedOp::create(*p, builder.getUnknownLoc(), "eaz")
+ p->create<NamedOp>(builder.getUnknownLoc(), "eaz");
+
+ CustomBuilder cb;
+ cb.f("faz");
+
+ // CHECK-MESSAGES: :[[@LINE+4]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-FIXES: OperandOp::create(builder, builder.getUnknownLoc(),
+ // CHECK-MESSAGES: :[[@LINE+3]]:5: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-FIXES: NamedOp::create(builder,
+ builder.create<OperandOp>(builder.getUnknownLoc(),
+ builder.create<NamedOp>(builder.getUnknownLoc(), "gaz").getResult());
}
|
|
@llvm/pr-subscribers-clang-tools-extra Author: Jacques Pienaar (jpienaar) ChangesPreviously this only checked for OpBuilder usage, but it could also be invoked via pointer. Also change how call range is calculated to avoid false overlaps which limits rewriting builder calls inside arguments of builder calls. Full diff: https://github.com/llvm/llvm-project/pull/159423.diff 2 Files Affected:
diff --git a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
index 0d81b9a9e38ca..8705c10f5c646 100644
--- a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
+++ b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
@@ -23,13 +23,11 @@ namespace {
using namespace ::clang::ast_matchers;
using namespace ::clang::transformer;
-EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
- RangeSelector CallArgs) {
+EditGenerator rewrite(RangeSelector Call, RangeSelector Builder) {
// This is using an EditGenerator rather than ASTEdit as we want to warn even
// if in macro.
- return [Call = std::move(Call), Builder = std::move(Builder),
- CallArgs =
- std::move(CallArgs)](const MatchFinder::MatchResult &Result)
+ return [Call = std::move(Call),
+ Builder = std::move(Builder)](const MatchFinder::MatchResult &Result)
-> Expected<SmallVector<transformer::Edit, 1>> {
Expected<CharSourceRange> CallRange = Call(Result);
if (!CallRange)
@@ -54,7 +52,7 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
auto NextToken = [&](std::optional<Token> CurrentToken) {
if (!CurrentToken)
return CurrentToken;
- if (CurrentToken->getEndLoc() >= CallRange->getEnd())
+ if (CurrentToken->is(clang::tok::eof))
return std::optional<Token>();
return clang::Lexer::findNextToken(CurrentToken->getLocation(), SM,
LangOpts);
@@ -68,9 +66,10 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
"missing '<' token");
}
+
std::optional<Token> EndToken = NextToken(LessToken);
- for (std::optional<Token> GreaterToken = NextToken(EndToken);
- GreaterToken && GreaterToken->getKind() != clang::tok::greater;
+ std::optional<Token> GreaterToken = NextToken(EndToken);
+ for (; GreaterToken && GreaterToken->getKind() != clang::tok::greater;
GreaterToken = NextToken(GreaterToken)) {
EndToken = GreaterToken;
}
@@ -79,12 +78,21 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
"missing '>' token");
}
+ std::optional<Token> ArgStart = NextToken(GreaterToken);
+ if (!ArgStart || ArgStart->getKind() != clang::tok::l_paren) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "missing '(' token");
+ }
+ std::optional<Token> Arg = NextToken(ArgStart);
+ if (!Arg) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "unexpected end of file");
+ }
+ bool hasArgs = Arg->getKind() != clang::tok::r_paren;
+
Expected<CharSourceRange> BuilderRange = Builder(Result);
if (!BuilderRange)
return BuilderRange.takeError();
- Expected<CharSourceRange> CallArgsRange = CallArgs(Result);
- if (!CallArgsRange)
- return CallArgsRange.takeError();
// Helper for concatting below.
auto GetText = [&](const CharSourceRange &Range) {
@@ -93,18 +101,19 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
Edit Replace;
Replace.Kind = EditKind::Range;
- Replace.Range = *CallRange;
- std::string CallArgsStr;
- // Only emit args if there are any.
- if (auto CallArgsText = GetText(*CallArgsRange).ltrim();
- !CallArgsText.rtrim().empty()) {
- CallArgsStr = llvm::formatv(", {}", CallArgsText);
+ Replace.Range.setBegin(CallRange->getBegin());
+ Replace.Range.setEnd(ArgStart->getEndLoc());
+ const Expr *BuilderExpr = Result.Nodes.getNodeAs<Expr>("builder");
+ std::string BuilderText = GetText(*BuilderRange).str();
+ if (BuilderExpr->getType()->isPointerType()) {
+ BuilderText = BuilderExpr->isImplicitCXXThis()
+ ? "*this"
+ : llvm::formatv("*{}", BuilderText).str();
}
- Replace.Replacement =
- llvm::formatv("{}::create({}{})",
- GetText(CharSourceRange::getTokenRange(
- LessToken->getEndLoc(), EndToken->getLastLoc())),
- GetText(*BuilderRange), CallArgsStr);
+ StringRef OpType = GetText(CharSourceRange::getTokenRange(
+ LessToken->getEndLoc(), EndToken->getLastLoc()));
+ Replace.Replacement = llvm::formatv("{}::create({}{}", OpType, BuilderText,
+ hasArgs ? ", " : "");
return SmallVector<Edit, 1>({Replace});
};
@@ -114,19 +123,17 @@ RewriteRuleWith<std::string> useNewMlirOpBuilderCheckRule() {
Stencil message = cat("use 'OpType::create(builder, ...)' instead of "
"'builder.create<OpType>(...)'");
// Match a create call on an OpBuilder.
- ast_matchers::internal::Matcher<Stmt> base =
- cxxMemberCallExpr(
- on(expr(hasType(
- cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"))))
- .bind("builder")),
- callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))),
- callee(cxxMethodDecl(hasName("create"))))
- .bind("call");
+ auto BuilderType = cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"));
+ ast_matchers::internal::Matcher<Stmt> base = cxxMemberCallExpr(
+ on(expr(anyOf(hasType(BuilderType), hasType(pointsTo(BuilderType))))
+ .bind("builder")),
+ callee(expr().bind("call")),
+ callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))),
+ callee(cxxMethodDecl(hasName("create"))));
return applyFirst(
// Attempt rewrite given an lvalue builder, else just warn.
{makeRule(cxxMemberCallExpr(unless(on(cxxTemporaryObjectExpr())), base),
- rewrite(node("call"), node("builder"), callArgs("call")),
- message),
+ rewrite(node("call"), node("builder")), message),
makeRule(base, noopEdit(node("call")), message)});
}
} // namespace
diff --git a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
index 0971a1611e3cb..1fbbf0a76c42a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
@@ -2,6 +2,7 @@
namespace mlir {
class Location {};
+class Value {};
class OpBuilder {
public:
template <typename OpTy, typename... Args>
@@ -28,6 +29,13 @@ struct NamedOp {
static NamedOp create(OpBuilder &builder, Location location, const char* name) {
return NamedOp(name);
}
+ Value getResult() { return Value(); }
+};
+struct OperandOp {
+ OperandOp(Value val) {}
+ static OperandOp create(OpBuilder &builder, Location location, Value val) {
+ return OperandOp(val);
+ }
};
} // namespace mlir
@@ -40,6 +48,15 @@ void g(mlir::OpBuilder &b) {
b.create<T>(b.getUnknownLoc(), "gaz");
}
+class CustomBuilder : public mlir::ImplicitLocOpBuilder {
+public:
+ mlir::NamedOp f(const char *name) {
+ // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: NamedOp::create(*this, name);
+ return create<mlir::NamedOp>(name);
+ }
+};
+
void f() {
mlir::OpBuilder builder;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
@@ -47,6 +64,8 @@ void f() {
builder.create<mlir:: ModuleOp>(builder.getUnknownLoc());
using mlir::NamedOp;
+ using mlir::OperandOp;
+
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "baz")
builder.create<NamedOp>(builder.getUnknownLoc(), "baz");
@@ -56,7 +75,7 @@ void f() {
// CHECK-FIXES: builder.getUnknownLoc(),
// CHECK-FIXES: "caz")
builder.
- create<NamedOp>(
+ create<NamedOp> (
builder.getUnknownLoc(),
"caz");
@@ -67,10 +86,25 @@ void f() {
mlir::ImplicitLocOpBuilder ib;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
- // CHECK-FIXES: mlir::ModuleOp::create(ib)
+ // CHECK-FIXES: mlir::ModuleOp::create(ib )
ib.create<mlir::ModuleOp>( );
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
+
+ auto *p = &builder;
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: NamedOp::create(*p, builder.getUnknownLoc(), "eaz")
+ p->create<NamedOp>(builder.getUnknownLoc(), "eaz");
+
+ CustomBuilder cb;
+ cb.f("faz");
+
+ // CHECK-MESSAGES: :[[@LINE+4]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-FIXES: OperandOp::create(builder, builder.getUnknownLoc(),
+ // CHECK-MESSAGES: :[[@LINE+3]]:5: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-FIXES: NamedOp::create(builder,
+ builder.create<OperandOp>(builder.getUnknownLoc(),
+ builder.create<NamedOp>(builder.getUnknownLoc(), "gaz").getResult());
}
|
Co-authored-by: EugeneZelenko <[email protected]>
clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
Outdated
Show resolved
Hide resolved
…p-builder.cpp Co-authored-by: Victor Chernyakin <[email protected]>
|
✅ With the latest revision this PR passed the C/C++ code linter. |
|
I don't know clang-tool processes well, I'm assuming you want a review from one of the regular contributors. But let me know if I should add regular LLVM project reviewer first. |
vbvictor
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apart from some comments in tests, LGTM
| // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: use 'OpType::create(builder, ...)' | ||
| // CHECK-FIXES: return mlir::NamedOp::create(*this, name); | ||
| return create<mlir::NamedOp>(name); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we add test with
using mlir;
create<NamedOp>(name);| // CHECK-FIXES: OperandOp::create(builder, builder.getUnknownLoc(), | ||
| // CHECK-MESSAGES: :[[@LINE+3]]:5: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder] | ||
| // CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "gaz").getResult()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of 2 separate check-fixes, can we use check-fixes-next to match expression as a whole? Or we intentionally keep separated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good question, I had kept them separate as its two different reports (so a report and its fixed together rather than separate per type). No strong feelings about this, I can make it match whole.
Previously this only checked for OpBuilder usage, but it could also be invoked via pointer. Also change how call range is calculated to avoid false overlaps which limits rewriting builder calls inside arguments of builder calls. --------- Co-authored-by: EugeneZelenko <[email protected]> Co-authored-by: Victor Chernyakin <[email protected]>
Previously this only checked for OpBuilder usage, but it could also be invoked via pointer. Also change how call range is calculated to avoid false overlaps which limits rewriting builder calls inside arguments of builder calls.