[flang] Fix a static_assert and a message location bug in first().
authorpeter klausler <pklausler@nvidia.com>
Fri, 27 Apr 2018 20:37:51 +0000 (13:37 -0700)
committerpeter klausler <pklausler@nvidia.com>
Fri, 27 Apr 2018 20:37:51 +0000 (13:37 -0700)
Original-commit: flang-compiler/f18@cd85bff31b1a93bfd7f9ad8344982f88670e3365
Reviewed-on: https://github.com/flang-compiler/f18/pull/73
Tree-same-pre-rewrite: false

flang/lib/parser/basic-parsers.h

index bf0222824076998a370c33a82bfc2ed161d4fef2..7af7f2a005f00e0ec4992e7a0917ae3a85eb85a2 100644 (file)
@@ -250,8 +250,8 @@ private:
       ParseState prevState{std::move(state)};
       state = std::move(backtrack);
       const auto &parser{std::get<J>(ps_)};
-      //      static_assert(std::is_same_v<resultType, typename
-      //      decltype(parser)::resultType>);
+      static_assert(std::is_same_v<resultType,
+          typename std::decay<decltype(parser)>::type::resultType>);
       result = parser.Parse(state);
       if (!result.has_value()) {
         auto prevEnd = prevState.GetLocation();
@@ -259,7 +259,7 @@ private:
         if (prevEnd == lastEnd) {
           prevState.messages().Incorporate(state.messages());
         }
-        if (prevEnd <= lastEnd) {
+        if (prevEnd >= lastEnd) {
           state = std::move(prevState);
         }
         ParseRest<J + 1>(result, state, backtrack);
@@ -281,7 +281,6 @@ template<typename... Ps> inline constexpr auto first(const Ps &... ps) {
 template<typename PA, typename PB>
 inline constexpr auto operator||(const PA &pa, const PB &pb) {
   return first(pa, pb);
-
 }
 #else  // g++ only: original implementation
 // If a and b are parsers, then a || b returns a parser that succeeds if
@@ -336,7 +335,7 @@ template<typename PA, typename PB>
 inline constexpr auto operator||(const PA &pa, const PB &pb) {
   return AlternativeParser<PA, PB>{pa, pb};
 }
-#endif // clang vs. g++ on operator|| implementations
+#endif  // clang vs. g++ on operator|| implementations
 
 // If a and b are parsers, then recovery(a,b) returns a parser that succeeds if
 // a does so, or if a fails and b succeeds.  If a succeeds, b is not attempted.