Reference

The address of a variable, held by a member of a host frame.

Declaration

Syntax

Reference(ttype type)

Arguments

Argument

Description

type

the type of the variable whose address the member holds.

Return values

None. A type is not evaluated.

Description

A Reference is the type of a member of a frame, the derived type that the nested_vars pass declares in a host so that its internal procedures reach the variables of the instance of the host that invoked them (see „Host Association“ in the design document). It is the type of such a member and of nothing else: the verifier reports a Reference anywhere else, including inside another type, as asr.verify.reference.member_only.

BindReference stores the address of a variable in the member. A StructInstanceMember of the member then designates that variable itself and has type type, the type of the variable, as asr.verify.reference.designator_type checks. It is the symbolic_value of a variable of HostAssociated storage, which stands for the variable in an internal procedure.

Unlike a Pointer, a member of Reference type has no association status and no value of its own, and nothing allocates, deallocates, finalizes, copies or default-initializes it with the object that contains it: generic code that does not know the type leaves it alone. A backend lays it out as the address of the storage of a variable of type type.

Examples

(Reference
  :type (Integer
    :kind 4
  )
)

It comes from this complete ASR text document:

(TranslationUnit
  :symtab (SymbolTable
    :id 0
    :symbols {
      "host_frame" (Program
        :symtab (SymbolTable
          :id 1
          :symbols {
            "k" (Variable
              :parent_symtab 1
              :name "k"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Integer
                :kind 4
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_asynchronous false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
              :common_block nil
            )
            "outer" (Function
              :symtab (SymbolTable
                :id 2
                :symbols {
                  "1_frame_n" (ExternalSymbol
                    :parent_symtab 2
                    :name "1_frame_n"
                    :external (SymbolRef 3 "n")
                    :module_name "frame"
                    :scope_names []
                    :original_name "n"
                    :access :Public
                  )
                  "f" (Variable
                    :parent_symtab 2
                    :name "f"
                    :dependencies []
                    :intent :Local
                    :symbolic_value nil
                    :value nil
                    :storage :Default
                    :type (StructType
                      :data_member_types [
                        (Reference
                          :type (Integer
                            :kind 4
                          )
                        )
                      ]
                      :member_function_types []
                      :is_cstruct true
                      :is_unlimited_polymorphic false
                    )
                    :type_declaration (SymbolRef 2 "frame")
                    :abi :Source
                    :access :Public
                    :presence :Required
                    :value_attr false
                    :target_attr false
                    :contiguous_attr false
                    :bindc_name nil
                    :is_volatile false
                    :is_asynchronous false
                    :is_protected false
                    :pass_attr :NotMethod
                    :self_argument nil
                    :codims []
                    :common_block nil
                  )
                  "frame" (Struct
                    :symtab (SymbolTable
                      :id 3
                      :symbols {
                        "n" (Variable
                          :parent_symtab 3
                          :name "n"
                          :dependencies []
                          :intent :Unspecified
                          :symbolic_value nil
                          :value nil
                          :storage :Default
                          :type (Reference
                            :type (Integer
                              :kind 4
                            )
                          )
                          :type_declaration nil
                          :abi :Source
                          :access :Public
                          :presence :Required
                          :value_attr false
                          :target_attr false
                          :contiguous_attr false
                          :bindc_name nil
                          :is_volatile false
                          :is_asynchronous false
                          :is_protected false
                          :pass_attr :NotMethod
                          :self_argument nil
                          :codims []
                          :common_block nil
                        )
                      }
                    )
                    :name "frame"
                    :struct_signature (StructType
                      :data_member_types [
                        (Reference
                          :type (Integer
                            :kind 4
                          )
                        )
                      ]
                      :member_function_types []
                      :is_cstruct true
                      :is_unlimited_polymorphic false
                    )
                    :dependencies []
                    :members [
                      "n"
                    ]
                    :member_functions []
                    :abi :Source
                    :access :Public
                    :is_packed false
                    :is_abstract false
                    :is_sequence false
                    :initializers []
                    :alignment nil
                    :parent nil
                    :kind_params []
                  )
                  "inner" (Function
                    :symtab (SymbolTable
                      :id 4
                      :symbols {
                        "f" (Variable
                          :parent_symtab 4
                          :name "f"
                          :dependencies []
                          :intent :In
                          :symbolic_value nil
                          :value nil
                          :storage :Default
                          :type (StructType
                            :data_member_types [
                              (Reference
                                :type (Integer
                                  :kind 4
                                )
                              )
                            ]
                            :member_function_types []
                            :is_cstruct true
                            :is_unlimited_polymorphic false
                          )
                          :type_declaration (SymbolRef 2 "frame")
                          :abi :Source
                          :access :Public
                          :presence :Required
                          :value_attr false
                          :target_attr false
                          :contiguous_attr false
                          :bindc_name nil
                          :is_volatile false
                          :is_asynchronous false
                          :is_protected false
                          :pass_attr :NotMethod
                          :self_argument nil
                          :codims []
                          :common_block nil
                        )
                        "n" (Variable
                          :parent_symtab 4
                          :name "n"
                          :dependencies [
                            "f"
                          ]
                          :intent :Local
                          :symbolic_value (StructInstanceMember
                            :v (Var
                              :v (SymbolRef 4 "f")
                            )
                            :m (SymbolRef 2 "1_frame_n")
                            :type (Integer
                              :kind 4
                            )
                            :value nil
                          )
                          :value nil
                          :storage :HostAssociated
                          :type (Integer
                            :kind 4
                          )
                          :type_declaration nil
                          :abi :Source
                          :access :Public
                          :presence :Required
                          :value_attr false
                          :target_attr false
                          :contiguous_attr false
                          :bindc_name nil
                          :is_volatile false
                          :is_asynchronous false
                          :is_protected false
                          :pass_attr :NotMethod
                          :self_argument nil
                          :codims []
                          :common_block nil
                        )
                      }
                    )
                    :name "inner"
                    :function_signature (FunctionType
                      :arg_types [
                        (StructType
                          :data_member_types [
                            (Reference
                              :type (Integer
                                :kind 4
                              )
                            )
                          ]
                          :member_function_types []
                          :is_cstruct true
                          :is_unlimited_polymorphic false
                        )
                      ]
                      :return_var_type nil
                      :abi :Source
                      :deftype :Implementation
                      :bindc_name nil
                      :elemental false
                      :pure false
                      :module false
                      :inline false
                      :static false
                      :restrictions []
                      :is_restriction false
                      :exec_space :Host
                    )
                    :dependencies []
                    :args [
                      (Var
                        :v (SymbolRef 4 "f")
                      )
                    ]
                    :body [
                      (Assignment
                        :target (Var
                          :v (SymbolRef 4 "n")
                        )
                        :value (IntegerBinOp
                          :left (Var
                            :v (SymbolRef 4 "n")
                          )
                          :op :Add
                          :right (IntegerConstant
                            :n 1
                            :type (Integer
                              :kind 4
                            )
                            :intboz_type :Decimal
                          )
                          :type (Integer
                            :kind 4
                          )
                          :value nil
                        )
                        :overloaded nil
                        :realloc_lhs false
                        :move_allocation false
                        :new_target false
                        :new_allocation false
                      )
                    ]
                    :return_var nil
                    :access :Public
                    :deterministic true
                    :side_effect_free true
                    :module_file nil
                  )
                  "n" (Variable
                    :parent_symtab 2
                    :name "n"
                    :dependencies []
                    :intent :InOut
                    :symbolic_value nil
                    :value nil
                    :storage :Default
                    :type (Integer
                      :kind 4
                    )
                    :type_declaration nil
                    :abi :Source
                    :access :Public
                    :presence :Required
                    :value_attr false
                    :target_attr false
                    :contiguous_attr false
                    :bindc_name nil
                    :is_volatile false
                    :is_asynchronous false
                    :is_protected false
                    :pass_attr :NotMethod
                    :self_argument nil
                    :codims []
                    :common_block nil
                  )
                }
              )
              :name "outer"
              :function_signature (FunctionType
                :arg_types [
                  (Integer
                    :kind 4
                  )
                ]
                :return_var_type nil
                :abi :Source
                :deftype :Implementation
                :bindc_name nil
                :elemental false
                :pure false
                :module false
                :inline false
                :static false
                :restrictions []
                :is_restriction false
                :exec_space :Host
              )
              :dependencies []
              :args [
                (Var
                  :v (SymbolRef 2 "n")
                )
              ]
              :body [
                (BindReference
                  :reference (StructInstanceMember
                    :v (Var
                      :v (SymbolRef 2 "f")
                    )
                    :m (SymbolRef 2 "1_frame_n")
                    :type (Integer
                      :kind 4
                    )
                    :value nil
                  )
                  :variable (Var
                    :v (SymbolRef 2 "n")
                  )
                )
                (SubroutineCall
                  :name (SymbolRef 2 "inner")
                  :original_name nil
                  :args [
                    (call_arg
                      :value (Var
                        :v (SymbolRef 2 "f")
                      )
                    )
                  ]
                  :dt nil
                  :strict_bounds_checking false
                )
              ]
              :return_var nil
              :access :Public
              :deterministic true
              :side_effect_free true
              :module_file nil
            )
          }
        )
        :name "host_frame"
        :dependencies []
        :body [
          (Assignment
            :target (Var
              :v (SymbolRef 1 "k")
            )
            :value (IntegerConstant
              :n 1
              :type (Integer
                :kind 4
              )
              :intboz_type :Decimal
            )
            :overloaded nil
            :realloc_lhs false
            :move_allocation false
            :new_target false
            :new_allocation false
          )
          (SubroutineCall
            :name (SymbolRef 1 "outer")
            :original_name nil
            :args [
              (call_arg
                :value (Var
                  :v (SymbolRef 1 "k")
                )
              )
            ]
            :dt nil
            :strict_bounds_checking false
          )
          (Print
            :text (StringFormat
              :fmt nil
              :args [
                (Var
                  :v (SymbolRef 1 "k")
                )
              ]
              :kind :FormatFortran
              :dtio_bindings []
              :dtio_unit nil
              :type (Allocatable
                :type (String
                  :kind 1
                  :len nil
                  :len_kind :DeferredLength
                  :physical_type :DescriptorString
                )
              )
              :value nil
            )
          )
        ]
        :global_init nil
      )
    }
  )
  :items []
  :global_init nil
)

See Also

BindReference, storage_type, Pointer, StructType