[flang] Add name match checks for interface procedures
authorPeter Steinfeld <psteinfeld@nvidia.com>
Sat, 17 Oct 2020 01:27:51 +0000 (18:27 -0700)
committerPeter Steinfeld <psteinfeld@nvidia.com>
Mon, 19 Oct 2020 14:51:17 +0000 (07:51 -0700)
We had neglected to check for name mismatches for procedure definitions that
appear in interfaces.

I also changed label11.f90 to an error test since I think they're better than
"FileCheck" tests.

Differential Revision: https://reviews.llvm.org/D89611

flang/lib/Semantics/resolve-labels.cpp
flang/test/Semantics/label11.f90

index 2ae84ed..d68812b 100644 (file)
@@ -356,11 +356,19 @@ public:
   }
 
   // C1564
+  void Post(const parser::InterfaceBody::Function &func) {
+    CheckOptionalName<parser::FunctionStmt>("FUNCTION", func,
+        std::get<parser::Statement<parser::EndFunctionStmt>>(func.t));
+  }
+
+  // C1564
   void Post(const parser::FunctionSubprogram &functionSubprogram) {
     CheckOptionalName<parser::FunctionStmt>("FUNCTION", functionSubprogram,
         std::get<parser::Statement<parser::EndFunctionStmt>>(
             functionSubprogram.t));
   }
+
+  // C1502
   void Post(const parser::InterfaceBlock &interfaceBlock) {
     auto &interfaceStmt{
         std::get<parser::Statement<parser::InterfaceStmt>>(interfaceBlock.t)};
@@ -381,7 +389,7 @@ public:
                 context_
                     .Say(currentPosition_,
                         parser::MessageFormattedText{
-                            "INTERFACE generic-name (%s) mismatch"_en_US,
+                            "INTERFACE generic-name (%s) mismatch"_err_en_US,
                             namePointer->source})
                     .Attach(interfaceStmt.source, "mismatched INTERFACE"_en_US);
               }
@@ -433,6 +441,12 @@ public:
   }
 
   // C1567
+  void Post(const parser::InterfaceBody::Subroutine &sub) {
+    CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE", sub,
+        std::get<parser::Statement<parser::EndSubroutineStmt>>(sub.t));
+  }
+
+  // C1567
   void Post(const parser::SubroutineSubprogram &subroutineSubprogram) {
     CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE",
         subroutineSubprogram,
index 3f139f3..a660c5b 100644 (file)
@@ -1,39 +1,66 @@
-! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s
-! CHECK: BLOCK DATA subprogram name mismatch
-! CHECK: should be
-! CHECK: FUNCTION name mismatch
-! CHECK: SUBROUTINE name mismatch
-! CHECK: PROGRAM name mismatch
-! CHECK: SUBMODULE name mismatch
-! CHECK: INTERFACE generic-name (t7) mismatch
-! CHECK: mismatched INTERFACE
-! CHECK: derived type definition name mismatch
-! CHECK: MODULE PROCEDURE name mismatch
-! CHECK: MODULE name mismatch
+! RUN: %S/test_errors.sh %s %t %f18
 ! C739 If END TYPE is followed by a type-name, the type-name shall be the
 ! same as that in the corresponding derived-type-stmt.
+! C1401 The program-name shall not be included in the end-program-stmt unless
+! the optional program-stmt is used. If included, it shall be identical to the
+! program-name specified in the program-stmt.
+! C1402 If the module-name is specified in the end-module-stmt, it shall be
+! identical to the module-name specified in the module-stmt.
+! C1413 If a submodule-name appears in the end-submodule-stmt, it shall be
+! identical to the one in the submodule-stmt.
+! C1414 If a function-name appears in the end-function-stmt, it shall be
+! identical to the function-name specified in the function-stmt.
+! C1502 If the end-interface-stmt includes a generic-spec, the interface-stmt
+! shall specify the same generic-spec
+! C1564 If a function-name appears in the end-function-stmt, it shall be
+! identical to the function-name specified in the function-stmt.
+! C1567 If a submodule-name appears in the end-submodule-stmt, it shall be
+! identical to the one in the submodule-stmt.
+! C1569 If the module-name is specified in the end-module-stmt, it shall be
+! identical to the module-name specified in the module-stmt
 
 block data t1
+!ERROR: BLOCK DATA subprogram name mismatch
 end block data t2
 
 function t3
+!ERROR: FUNCTION name mismatch
 end function t4
 
 subroutine t9
+!ERROR: SUBROUTINE name mismatch
 end subroutine t10
 
 program t13
+!ERROR: END PROGRAM name mismatch
 end program t14
 
 submodule (mod) t15
+!ERROR: SUBMODULE name mismatch
 end submodule t16
 
 module t5
   interface t7
+  !ERROR: INTERFACE generic-name (t7) mismatch
   end interface t8
   type t17
+  !ERROR: derived type definition name mismatch
   end type t18
+
+  abstract interface
+    subroutine subrFront()
+    !ERROR: SUBROUTINE name mismatch
+    end subroutine subrBack
+    function funcFront(x)
+      real, intent(in) :: x
+      real funcFront
+    !ERROR: FUNCTION name mismatch
+    end function funcBack
+  end interface
+
 contains
   module procedure t11
+  !ERROR: MODULE PROCEDURE name mismatch
   end procedure t12
+!ERROR: MODULE name mismatch
 end module mox