[flang] Fix issue 392, improve the error message when a DO loop is
authorPeter Steinfeld <psteinfeld@nvidia.com>
Wed, 10 Apr 2019 16:45:41 +0000 (09:45 -0700)
committerPeter Steinfeld <psteinfeld@nvidia.com>
Wed, 10 Apr 2019 16:50:27 +0000 (09:50 -0700)
terminated by a statement other than END DO or CONTINUE.

Original-commit: flang-compiler/f18@0a9280eab16394b578d8b1eae76e3a679b697770
Reviewed-on: https://github.com/flang-compiler/f18/pull/398
Tree-same-pre-rewrite: false

flang/lib/semantics/resolve-labels.cc
flang/test/semantics/canondo07.f90 [new file with mode: 0644]

index b56bb51..466f271 100644 (file)
@@ -893,17 +893,19 @@ void CheckLabelDoConstraints(const SourceStmtList &dos,
           parser::MessageFormattedText{
               "label '%u' is not in scope"_en_US, SayLabel(label)});
     } else if (!doTarget.labeledStmtClassificationSet.test(
-                   TargetStatementEnum::Do) &&
-        !doTarget.labeledStmtClassificationSet.test(
-            TargetStatementEnum::CompatibleDo)) {
-      errorHandler.Say(doTarget.parserCharBlock,
-          parser::MessageFormattedText{
-              "'%u' invalid DO terminal statement"_err_en_US, SayLabel(label)});
-    } else if (!doTarget.labeledStmtClassificationSet.test(
                    TargetStatementEnum::Do)) {
-      errorHandler.Say(doTarget.parserCharBlock,
-          parser::MessageFormattedText{
-              "'%u' invalid DO terminal statement"_en_US, SayLabel(label)});
+      if (!doTarget.labeledStmtClassificationSet.test(
+              TargetStatementEnum::CompatibleDo)) {
+        errorHandler.Say(doTarget.parserCharBlock,
+            parser::MessageFormattedText{
+                "'%u' DO statements must terminate with END DO or CONTINUE"_err_en_US,
+                SayLabel(label)});
+      } else {
+        errorHandler.Say(doTarget.parserCharBlock,
+            parser::MessageFormattedText{
+                "'%u' Obsolete construct not allowed.  DO statements must terminate with END DO or CONTINUE"_en_US,
+                SayLabel(label)});
+      }
     } else {
       loopBodies.emplace_back(SkipLabel(position), doTarget.parserCharBlock);
     }
diff --git a/flang/test/semantics/canondo07.f90 b/flang/test/semantics/canondo07.f90
new file mode 100644 (file)
index 0000000..5fb8fc6
--- /dev/null
@@ -0,0 +1,24 @@
+! Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.
+!
+! Licensed under the Apache License, Version 2.0 (the "License");
+! you may not use this file except in compliance with the License.
+! You may obtain a copy of the License at
+!
+!     http://www.apache.org/licenses/LICENSE-2.0
+!
+! Unless required by applicable law or agreed to in writing, software
+! distributed under the License is distributed on an "AS IS" BASIS,
+! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+! See the License for the specific language governing permissions and
+! limitations under the License.
+
+! Error test -- DO loop uses obsolete loop termination statement
+! See R1131 and C1131
+
+! RUN: ${F18} -funparse-with-symbols %s 2>&1 | ${FileCheck} %s
+! CHECK: Obsolete construct not allowed.  DO statements must terminate with END DO or CONTINUE
+
+program endDo
+  do 10 i = 1, 5
+10  print *, "in loop"
+end program endDo