summaryrefslogtreecommitdiff
path: root/flang/module
diff options
context:
space:
mode:
authorPeter Steinfeld <psteinfeld@nvidia.com>2021-04-28 12:57:50 -0700
committerPeter Steinfeld <psteinfeld@nvidia.com>2021-04-30 09:05:05 -0700
commit8989268dae30d38bd6799038e14e6e33ee5528ad (patch)
tree6be62440064d96a8204c5ecb903c6a64f2f66c9b /flang/module
parenta27af1d8166cc8cebd6ecfed94042852922d8239 (diff)
downloadllvm-8989268dae30d38bd6799038e14e6e33ee5528ad.tar.gz
[flang] Allow KIND type parameters to be used as LEN parameters of components
When producing the runtime type information for a component of a derived type that had a LEN type parameter, we were not allowing a KIND parameter of the derived type. This was causing one of the NAG correctness tests to fail (.../hibiya/d5.f90). I added a test to our own test suite to check for this. Also, I fixed a typo in .../module/__fortran_type_info.f90. I allowed KIND type parameters to be used for the declarations of components that use LEN parameters by constant folding the value of the LEN parameter. To make the constant folding work, I had to put the semantics::DerivedTypeSpec of the associated derived type into the folding context. To get this semantics::DerivedTypeSpec, I changed the value of the semantics::Scope object that was passed to DescribeComponent() to be the derived type scope rather than the containing non-derived type scope. This scope change, in turn, caused differences in the symbol table output that is checked in typeinfo01.f90. Most of these differences were in the order that the symbols appeared in the dump. But one of them changed one of the values from "CHARACTER(2_8,1)" to "CHARACTER(1_8,1)". I'm not sure if these changes are significant. Please verify that the results of this test are still valid. Also, I wonder if there are other situations in this code where we should be folding constants. For example, what if the field of a component has a component whose type is a PDT with a LEN type parameter, and the component's declaration depends on the KIND type parameter of the current PDT. Here's an example: type string(stringkind) integer,kind :: stringkind character(stringkind) :: value end type string type outer(kindparam) integer,kind :: kindparam type(string(kindparam)) :: field end type outer I don't understand the code or what it's trying to accomplish well enough to figure out if such cases are correctly handled by my new code. Differential Revision: https://reviews.llvm.org/D101482
Diffstat (limited to 'flang/module')
-rw-r--r--flang/module/__fortran_type_info.f902
1 files changed, 1 insertions, 1 deletions
diff --git a/flang/module/__fortran_type_info.f90 b/flang/module/__fortran_type_info.f90
index 6a2b9dcf25b4..eaa82e0cb5c3 100644
--- a/flang/module/__fortran_type_info.f90
+++ b/flang/module/__fortran_type_info.f90
@@ -53,7 +53,7 @@ module __Fortran_type_info
character(len=:), pointer :: name
end type
- ! Array bounds and type parameters of ocmponents are deferred
+ ! Array bounds and type parameters of components are deferred
! (for allocatables and pointers), explicit constants, or
! taken from LEN type parameters for automatic components.
enum, bind(c) ! Value::Genre