diff options
author | Peter Klausler <pklausler@nvidia.com> | 2025-01-27 08:56:25 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-27 08:56:25 -0800 |
commit | f5ddb1012de1c7c7c958aa288932caead9607b07 (patch) | |
tree | 6d23e349ec1a77d14af0905abf9acc8b8ada7c96 | |
parent | 3ac00784ac3cd8b435c0c6be36f81f786ca5e489 (diff) | |
download | llvm-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.cpp | 4 | ||||
-rw-r--r-- | flang/test/Semantics/bug123534.f90 | 33 |
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 |