aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2025-01-27 08:56:25 -0800
committerGitHub <noreply@github.com>2025-01-27 08:56:25 -0800
commitf5ddb1012de1c7c7c958aa288932caead9607b07 (patch)
tree6d23e349ec1a77d14af0905abf9acc8b8ada7c96
parent3ac00784ac3cd8b435c0c6be36f81f786ca5e489 (diff)
downloadllvm-f5ddb1012de1c7c7c958aa288932caead9607b07.zip
llvm-f5ddb1012de1c7c7c958aa288932caead9607b07.tar.gz
llvm-f5ddb1012de1c7c7c958aa288932caead9607b07.tar.bz2
[flang] Fix crash in module file generation (#123859)
An assertion in module file generation didn't allow for a case that has arisen in a test; remove it, extend commentary, and add a regression test. Fixes https://github.com/llvm/llvm-project/issues/123534.
-rw-r--r--flang/lib/Semantics/mod-file.cpp4
-rw-r--r--flang/test/Semantics/bug123534.f9033
2 files changed, 35 insertions, 2 deletions
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index 4367dd1..b45f1c0 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -1799,8 +1799,8 @@ bool SubprogramSymbolCollector::NeedImport(
return found->has<UseDetails>() && found->owner() != scope_;
} else {
// "found" can be null in the case of a use-associated derived type's
- // parent type
- CHECK(symbol.has<DerivedTypeDetails>());
+ // parent type, and also in the case of an object (like a dummy argument)
+ // used to define a length or bound of a nested interface.
return false;
}
}
diff --git a/flang/test/Semantics/bug123534.f90 b/flang/test/Semantics/bug123534.f90
new file mode 100644
index 0000000..0a94336
--- /dev/null
+++ b/flang/test/Semantics/bug123534.f90
@@ -0,0 +1,33 @@
+! RUN: %python %S/test_modfile.py %s %flang_fc1
+! Simplified regression test for crashreported in
+! https://github.com/llvm/llvm-project/issues/123534.
+module m
+ interface
+ ! f1 returns a pointer to a procedure whose result characteristics
+ ! depend on the value of a dummy argument.
+ function f1()
+ interface
+ function f2(n)
+ integer, intent(in) :: n
+ character(n), pointer :: f2
+ end
+ end interface
+ procedure (f2), pointer :: f1
+ end
+ end interface
+end
+
+!Expect: m.mod
+!module m
+!interface
+!function f1()
+!interface
+!function f2(n)
+!integer(4),intent(in)::n
+!character(n,1),pointer::f2
+!end
+!end interface
+!procedure(f2),pointer::f1
+!end
+!end interface
+!end