blob: 171f1ea5f3df91bb6d48dd8b8972ded84dca3474 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1999-2014 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
"GNU Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>The GNU Fortran Compiler: Argument passing conventions</title>
<meta name="description" content="The GNU Fortran Compiler: Argument passing conventions">
<meta name="keywords" content="The GNU Fortran Compiler: Argument passing conventions">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Naming-and-argument_002dpassing-conventions.html#Naming-and-argument_002dpassing-conventions" rel="up" title="Naming and argument-passing conventions">
<link href="Intrinsic-Procedures.html#Intrinsic-Procedures" rel="next" title="Intrinsic Procedures">
<link href="Naming-conventions.html#Naming-conventions" rel="prev" title="Naming conventions">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Argument-passing-conventions"></a>
<div class="header">
<p>
Previous: <a href="Naming-conventions.html#Naming-conventions" accesskey="p" rel="prev">Naming conventions</a>, Up: <a href="Naming-and-argument_002dpassing-conventions.html#Naming-and-argument_002dpassing-conventions" accesskey="u" rel="up">Naming and argument-passing conventions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Argument-passing-conventions-1"></a>
<h4 class="subsection">7.4.2 Argument passing conventions</h4>
<p>Subroutines do not return a value (matching C99&rsquo;s <code>void</code>) while
functions either return a value as specified in the platform ABI or
the result variable is passed as hidden argument to the function and
no result is returned. A hidden result variable is used when the
result variable is an array or of type <code>CHARACTER</code>.
</p>
<p>Arguments are passed according to the platform ABI. In particular,
complex arguments might not be compatible to a struct with two real
components for the real and imaginary part. The argument passing
matches the one of C99&rsquo;s <code>_Complex</code>. Functions with scalar
complex result variables return their value and do not use a
by-reference argument. Note that with the <samp>-ff2c</samp> option,
the argument passing is modified and no longer completely matches
the platform ABI. Some other Fortran compilers use <code>f2c</code>
semantic by default; this might cause problems with
interoperablility.
</p>
<p>GNU Fortran passes most arguments by reference, i.e. by passing a
pointer to the data. Note that the compiler might use a temporary
variable into which the actual argument has been copied, if required
semantically (copy-in/copy-out).
</p>
<p>For arguments with <code>ALLOCATABLE</code> and <code>POINTER</code>
attribute (including procedure pointers), a pointer to the pointer
is passed such that the pointer address can be modified in the
procedure.
</p>
<p>For dummy arguments with the <code>VALUE</code> attribute: Scalar arguments
of the type <code>INTEGER</code>, <code>LOGICAL</code>, <code>REAL</code> and
<code>COMPLEX</code> are passed by value according to the platform ABI.
(As vendor extension and not recommended, using <code>%VAL()</code> in the
call to a procedure has the same effect.) For <code>TYPE(C_PTR)</code> and
procedure pointers, the pointer itself is passed such that it can be
modified without affecting the caller.
</p>
<p>For Boolean (<code>LOGICAL</code>) arguments, please note that GCC expects
only the integer value 0 and 1. If a GNU Fortran <code>LOGICAL</code>
variable contains another integer value, the result is undefined.
As some other Fortran compilers use <em>-1</em> for <code>.TRUE.</code>,
extra care has to be taken &ndash; such as passing the value as
<code>INTEGER</code>. (The same value restriction also applies to other
front ends of GCC, e.g. to GCC&rsquo;s C99 compiler for <code>_Bool</code>
or GCC&rsquo;s Ada compiler for <code>Boolean</code>.)
</p>
<p>For arguments of <code>CHARACTER</code> type, the character length is passed
as hidden argument. For deferred-length strings, the value is passed
by reference, otherwise by value. The character length has the type
<code>INTEGER(kind=4)</code>. Note with C binding, <code>CHARACTER(len=1)</code>
result variables are returned according to the platform ABI and no
hidden length argument is used for dummy arguments; with <code>VALUE</code>,
those variables are passed by value.
</p>
<p>For <code>OPTIONAL</code> dummy arguments, an absent argument is denoted
by a NULL pointer, except for scalar dummy arguments of type
<code>INTEGER</code>, <code>LOGICAL</code>, <code>REAL</code> and <code>COMPLEX</code>
which have the <code>VALUE</code> attribute. For those, a hidden Boolean
argument (<code>logical(kind=C_bool),value</code>) is used to indicate
whether the argument is present.
</p>
<p>Arguments which are assumed-shape, assumed-rank or deferred-rank
arrays or, with <samp>-fcoarray=lib</samp>, allocatable scalar coarrays use
an array descriptor. All other arrays pass the address of the
first element of the array. With <samp>-fcoarray=lib</samp>, the token
and the offset belonging to nonallocatable coarrays dummy arguments
are passed as hidden argument along the character length hidden
arguments. The token is an oparque pointer identifying the coarray
and the offset is a passed-by-value integer of kind <code>C_PTRDIFF_T</code>,
denoting the byte offset between the base address of the coarray and
the passed scalar or first element of the passed array.
</p>
<p>The arguments are passed in the following order
</p><ul>
<li> Result variable, when the function result is passed by reference
</li><li> Character length of the function result, if it is a of type
<code>CHARACTER</code> and no C binding is used
</li><li> The arguments in the order in which they appear in the Fortran
declaration
</li><li> The the present status for optional arguments with value attribute,
which are internally passed by value
</li><li> The character length and/or coarray token and offset for the first
argument which is a <code>CHARACTER</code> or a nonallocatable coarray dummy
argument, followed by the hidden arguments of the next dummy argument
of such a type
</li></ul>
<hr>
<div class="header">
<p>
Previous: <a href="Naming-conventions.html#Naming-conventions" accesskey="p" rel="prev">Naming conventions</a>, Up: <a href="Naming-and-argument_002dpassing-conventions.html#Naming-and-argument_002dpassing-conventions" accesskey="u" rel="up">Naming and argument-passing conventions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>