[flang] fix bug that could lose nonstandard usage warning messages
authorpeter klausler <pklausler@nvidia.com>
Mon, 7 May 2018 19:37:10 +0000 (12:37 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 7 May 2018 19:37:10 +0000 (12:37 -0700)
Original-commit: flang-compiler/f18@ff48aa95fd0b2c7bad474631c576f3fb4c566a91
Reviewed-on: https://github.com/flang-compiler/f18/pull/83
Tree-same-pre-rewrite: false

flang/lib/parser/basic-parsers.h
flang/lib/parser/parse-state.h

index 8d0f255..9b71421 100644 (file)
@@ -97,11 +97,10 @@ public:
     std::optional<resultType> result{parser_.Parse(state)};
     if (result.has_value()) {
       messages.Annex(state.messages());
-      state.messages() = std::move(messages);
     } else {
       state = std::move(backtrack);
-      state.messages() = std::move(messages);
     }
+    state.messages() = std::move(messages);
     return result;
   }
 
@@ -271,6 +270,9 @@ private:
         auto lastEnd = state.GetLocation();
         if (prevEnd == lastEnd) {
           prevState.messages().Incorporate(state.messages());
+          if (state.anyDeferredMessages()) {
+            prevState.set_anyDeferredMessages();
+          }
         }
         if (prevEnd >= lastEnd) {
           state = std::move(prevState);
@@ -380,11 +382,15 @@ public:
       return ax;
     }
     messages.Annex(state.messages());
+    bool hadDeferredMessages{state.anyDeferredMessages()};
     state = std::move(backtrack);
     state.set_deferMessages(true);
     std::optional<resultType> bx{pb_.Parse(state)};
     state.messages() = std::move(messages);
     state.set_deferMessages(originallyDeferred);
+    if (hadDeferredMessages) {
+      state.set_anyDeferredMessages();
+    }
     if (bx.has_value()) {
       state.set_anyErrorRecovery();
     }
index b479278..12f80a0 100644 (file)
@@ -49,7 +49,8 @@ public:
       warnOnDeprecatedUsage_{that.warnOnDeprecatedUsage_},
       anyErrorRecovery_{that.anyErrorRecovery_},
       anyConformanceViolation_{that.anyConformanceViolation_},
-      deferMessages_{that.deferMessages_} {}
+      deferMessages_{that.deferMessages_}, anyDeferredMessages_{
+                                               that.anyDeferredMessages_} {}
   ParseState(ParseState &&that)
     : p_{that.p_}, limit_{that.limit_}, messages_{std::move(that.messages_)},
       context_{std::move(that.context_)}, userState_{that.userState_},
@@ -142,7 +143,7 @@ public:
   }
 
   bool anyDeferredMessages() const { return anyDeferredMessages_; }
-  void set_anyDeferredMessages(bool yes) { anyDeferredMessages_ = yes; }
+  void set_anyDeferredMessages() { anyDeferredMessages_ = true; }
 
   const char *GetLocation() const { return p_; }