[flang] some debugging after more testing
authorpeter klausler <pklausler@nvidia.com>
Mon, 1 Apr 2019 23:15:47 +0000 (16:15 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 1 Apr 2019 23:23:34 +0000 (16:23 -0700)
Original-commit: flang-compiler/f18@005b841dd1140a809fb8123ed5b02048b8e1a4d3
Reviewed-on: https://github.com/flang-compiler/f18/pull/373

flang/lib/parser/dump-parse-tree.h
flang/lib/parser/parse-tree-visitor.h
flang/lib/parser/stmt-parser.h

index 818e03e0fd21691a8f46dc1bae7af80ce148b2cc..287e9eedb94c9250d145c899ecaa77b638b6700a 100644 (file)
@@ -790,6 +790,8 @@ public:
   bool Pre(const parser::CharBlock &) { return true; }
   void Post(const parser::CharBlock &) {}
 
+  template<typename T> bool Pre(const parser::Statement<T> &) { return true; }
+  template<typename T> void Post(const parser::Statement<T> &) {}
   template<typename T> bool Pre(const parser::UnlabeledStatement<T> &) {
     return true;
   }
index 44341061e43384cd24875e65785b6b6c7403b29d..15a760a81ef13c9af8b79ffc6ca75802fa03e882 100644 (file)
@@ -291,6 +291,23 @@ template<typename T, typename M> void Walk(DefaultChar<T> &x, M &mutator) {
   }
 }
 
+template<typename T, typename V> void Walk(const Statement<T> &x, V &visitor) {
+  if (visitor.Pre(x)) {
+    // N.B. The label, if any, is not visited.
+    Walk(x.source, visitor);
+    Walk(x.statement, visitor);
+    visitor.Post(x);
+  }
+}
+template<typename T, typename M> void Walk(Statement<T> &x, M &mutator) {
+  if (mutator.Pre(x)) {
+    // N.B. The label, if any, is not visited.
+    Walk(x.source, mutator);
+    Walk(x.statement, mutator);
+    mutator.Post(x);
+  }
+}
+
 template<typename T, typename V>
 void Walk(const UnlabeledStatement<T> &x, V &visitor) {
   if (visitor.Pre(x)) {
index 88affd12724d70eee9d5699da274556d97eb6991..021fa7fbe87153c3be84e2aaa21329867b7982ab 100644 (file)
@@ -51,10 +51,8 @@ template<typename PA> inline constexpr auto statement(const PA &p) {
 // unlabeledStatement() is basically statement() for those few situations
 // in Fortran where a statement cannot have a label.
 template<typename PA> inline constexpr auto unlabeledStatement(const PA &p) {
-  return skipStuffBeforeStatement >>
-      sourced(
-          construct<UnlabeledStatement<typename PA::resultType>>(space >> p)) /
-      endOfStmt;
+  return space >>
+      sourced(construct<UnlabeledStatement<typename PA::resultType>>(p));
 }
 
 // This unambiguousStatement() variant of statement() provides better error