-
Notifications
You must be signed in to change notification settings - Fork 14.2k
[flang] Accept more unrecognized !DIR$ compiler directives #85829
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
When encountering an unparsable !DIR$ compiler directive line, accept it as a whole source line and emit a warning that it is unrecognizable. Fixes llvm#59107, llvm#82212, and llvm#82654.
@llvm/pr-subscribers-flang-parser Author: Peter Klausler (klausler) ChangesWhen encountering an unparsable !DIR$ compiler directive line, accept it as a whole source line and emit a warning that it is unrecognizable. Fixes #59107, #82212, and #82654. Full diff: https://github.com/llvm/llvm-project/pull/85829.diff 6 Files Affected:
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index b2c3d92909375c..06c168a5de612c 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -207,6 +207,7 @@ class ParseTreeDumper {
NODE(CompilerDirective, LoopCount)
NODE(CompilerDirective, AssumeAligned)
NODE(CompilerDirective, NameValue)
+ NODE(CompilerDirective, Unrecognized)
NODE(parser, ComplexLiteralConstant)
NODE(parser, ComplexPart)
NODE(parser, ComponentArraySpec)
diff --git a/flang/include/flang/Parser/parse-tree-visitor.h b/flang/include/flang/Parser/parse-tree-visitor.h
index 79ea29f4b7f325..81d01dbdd65cc9 100644
--- a/flang/include/flang/Parser/parse-tree-visitor.h
+++ b/flang/include/flang/Parser/parse-tree-visitor.h
@@ -861,6 +861,18 @@ template <typename M> void Walk(CompilerDirective &x, M &mutator) {
}
}
template <typename V>
+void Walk(const CompilerDirective::Unrecognized &x, V &visitor) {
+ if (visitor.Pre(x)) {
+ visitor.Post(x);
+ }
+}
+template <typename M>
+void Walk(CompilerDirective::Unrecognized &x, M &mutator) {
+ if (mutator.Pre(x)) {
+ mutator.Post(x);
+ }
+}
+template <typename V>
void Walk(const OmpLinearClause::WithModifier &x, V &visitor) {
if (visitor.Pre(x)) {
Walk(x.modifier, visitor);
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index c96abfba491d4b..85e8121dd1250c 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3298,7 +3298,8 @@ struct StmtFunctionStmt {
// Compiler directives
// !DIR$ IGNORE_TKR [ [(tkrdmac...)] name ]...
// !DIR$ LOOP COUNT (n1[, n2]...)
-// !DIR$ name...
+// !DIR$ name[=value] [, name[=value]]... = can be :
+// !DIR$ <anything else>
struct CompilerDirective {
UNION_CLASS_BOILERPLATE(CompilerDirective);
struct IgnoreTKR {
@@ -3316,9 +3317,10 @@ struct CompilerDirective {
TUPLE_CLASS_BOILERPLATE(NameValue);
std::tuple<Name, std::optional<std::uint64_t>> t;
};
+ struct Unrecognized {};
CharBlock source;
std::variant<std::list<IgnoreTKR>, LoopCount, std::list<AssumeAligned>,
- std::list<NameValue>>
+ std::list<NameValue>, Unrecognized>
u;
};
diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp
index fc81a477897a3c..fd28eea0f947d2 100644
--- a/flang/lib/Parser/Fortran-parsers.cpp
+++ b/flang/lib/Parser/Fortran-parsers.cpp
@@ -1261,24 +1261,28 @@ TYPE_PARSER(construct<StatOrErrmsg>("STAT =" >> statVariable) ||
// Directives, extensions, and deprecated statements
// !DIR$ IGNORE_TKR [ [(tkrdmac...)] name ]...
// !DIR$ LOOP COUNT (n1[, n2]...)
-// !DIR$ name...
+// !DIR$ name[=value] [, name[=value]]...
+// !DIR$ <anything else>
constexpr auto ignore_tkr{
- "DIR$ IGNORE_TKR" >> optionalList(construct<CompilerDirective::IgnoreTKR>(
- maybe(parenthesized(many(letter))), name))};
+ "IGNORE_TKR" >> optionalList(construct<CompilerDirective::IgnoreTKR>(
+ maybe(parenthesized(many(letter))), name))};
constexpr auto loopCount{
- "DIR$ LOOP COUNT" >> construct<CompilerDirective::LoopCount>(
- parenthesized(nonemptyList(digitString64)))};
-constexpr auto assumeAligned{"DIR$ ASSUME_ALIGNED" >>
+ "LOOP COUNT" >> construct<CompilerDirective::LoopCount>(
+ parenthesized(nonemptyList(digitString64)))};
+constexpr auto assumeAligned{"ASSUME_ALIGNED" >>
optionalList(construct<CompilerDirective::AssumeAligned>(
indirect(designator), ":"_tok >> digitString64))};
-TYPE_PARSER(beginDirective >>
- sourced(construct<CompilerDirective>(ignore_tkr) ||
- construct<CompilerDirective>(loopCount) ||
- construct<CompilerDirective>(assumeAligned) ||
+TYPE_PARSER(beginDirective >> "DIR$ "_tok >>
+ sourced((construct<CompilerDirective>(ignore_tkr) ||
+ construct<CompilerDirective>(loopCount) ||
+ construct<CompilerDirective>(assumeAligned) ||
+ construct<CompilerDirective>(
+ many(construct<CompilerDirective::NameValue>(
+ name, maybe(("="_tok || ":"_tok) >> digitString64))))) /
+ endOfStmt ||
construct<CompilerDirective>(
- "DIR$" >> many(construct<CompilerDirective::NameValue>(name,
- maybe(("="_tok || ":"_tok) >> digitString64))))) /
- endOfStmt)
+ SkipTo<'\n'>{} >> pure<CompilerDirective::Unrecognized>()) /
+ endOfStmt))
TYPE_PARSER(extension<LanguageFeature::CrayPointer>(
"nonstandard usage: based POINTER"_port_en_US,
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index baba4863f5775f..c06458833f0729 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -1827,6 +1827,10 @@ class UnparseVisitor {
[&](const std::list<CompilerDirective::NameValue> &names) {
Walk("!DIR$ ", names, " ");
},
+ [&](const CompilerDirective::Unrecognized &) {
+ Word("!DIR$ ");
+ Word(x.source.ToString());
+ },
},
x.u);
Put('\n');
diff --git a/flang/test/Parser/unrecognized-dir.f90 b/flang/test/Parser/unrecognized-dir.f90
new file mode 100644
index 00000000000000..ba6fff7562e2d5
--- /dev/null
+++ b/flang/test/Parser/unrecognized-dir.f90
@@ -0,0 +1,4 @@
+! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s
+!CHECK: warning: Compiler directive was ignored
+!DIR$ Not a recognized directive
+end
|
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.
LGTM
This patch seems to break builds with gcc-13.2.0. I get:
Would you mind taking a look? Thanks! |
Will do. |
The error is bogus; PR #86708 rearranges the code a little bit to avoid the false error. If you like the fix, please go ahead and merge it. |
Thank you so much for looking into this and fixing it so quickly! I just merged the patch. |
When encountering an unparsable !DIR$ compiler directive line, accept it as a whole source line and emit a warning that it is unrecognizable.
Fixes #59107, #82212, and #82654.