[flang] Fix use-associated false-positive error
authorDaniil Dudkin <d.dudkin@partner.samsung.com>
Fri, 20 May 2022 09:11:36 +0000 (12:11 +0300)
committerDaniil Dudkin <d.dudkin@partner.samsung.com>
Fri, 20 May 2022 09:14:02 +0000 (12:14 +0300)
For the program provided as the test case flang fired the following
error:

    error: Semantic errors in main.f90
    error: 'foo' is not a procedure

This change fixes the error by postponing handling of `UseErrorDetails`
from `CharacterizeProcedure` to a later stage.

Reviewed By: kiranchandramohan

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

flang/lib/Evaluate/characteristics.cpp
flang/test/Semantics/resolve112.f90 [new file with mode: 0644]

index 95bc5f1..2cfdb9d 100644 (file)
@@ -485,6 +485,11 @@ static std::optional<Procedure> CharacterizeProcedure(
           [&](const semantics::UseDetails &use) {
             return CharacterizeProcedure(use.symbol(), context, seenProcs);
           },
+          [](const semantics::UseErrorDetails &) {
+            // Ambiguous use-association will be handled later during symbol
+            // checks, ignore UseErrorDetails here without actual symbol usage.
+            return std::optional<Procedure>{};
+          },
           [&](const semantics::HostAssocDetails &assoc) {
             return CharacterizeProcedure(assoc.symbol(), context, seenProcs);
           },
diff --git a/flang/test/Semantics/resolve112.f90 b/flang/test/Semantics/resolve112.f90
new file mode 100644 (file)
index 0000000..6c45854
--- /dev/null
@@ -0,0 +1,32 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+
+! If there are 2 or more use-associated symbols
+! from different modules with the same name,
+! the error should be generated only if
+! the name is actually used.
+module a
+  contains
+    function foo()
+      foo = 42
+    end function foo
+end module a
+
+module b
+  contains
+    function foo()
+      foo = 42
+    end function foo
+end module b
+
+subroutine without_error
+  use a
+  use b
+end subroutine without_error
+
+subroutine with_error
+  use a
+  use b
+  integer :: res
+  ! ERROR: Reference to 'foo' is ambiguous
+  res = foo()
+end subroutine with_error