diff options
author | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-29 22:26:17 +0000 |
---|---|---|
committer | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-03-29 22:26:17 +0000 |
commit | 532c2d791043ded996c9429bb9e36e1b6dd932df (patch) | |
tree | 5c179c350d8b5c238071125bf8bc0ecb063eff87 /gcc/fortran/trans-decl.c | |
parent | c21c015bf4c35f3f6fbaff0944a9260c92238870 (diff) | |
download | gcc-532c2d791043ded996c9429bb9e36e1b6dd932df.tar.gz |
2013-03-29 Tobias Burnus <burnus@net-b.de>
PR fortran/35203
* trans-decl.c (create_function_arglist): Pass hidden argument
for passed-by-value optional+value dummies.
* trans-expr.c (gfc_conv_expr_present,
gfc_conv_procedure_call): Handle those.
2013-03-29 Tobias Burnus <burnus@net-b.de>
PR fortran/35203
* gfortran.dg/optional_absent_3.f90: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197252 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 0e853bac6a1..fafde89f37b 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -2142,6 +2142,27 @@ create_function_arglist (gfc_symbol * sym) type = gfc_sym_type (f->sym); } } + /* For noncharacter scalar intrinsic types, VALUE passes the value, + hence, the optional status cannot be transfered via a NULL pointer. + Thus, we will use a hidden argument in that case. */ + else if (f->sym->attr.optional && f->sym->attr.value + && !f->sym->attr.dimension && !f->sym->ts.type != BT_CLASS + && f->sym->ts.type != BT_DERIVED) + { + tree tmp; + strcpy (&name[1], f->sym->name); + name[0] = '_'; + tmp = build_decl (input_location, + PARM_DECL, get_identifier (name), + boolean_type_node); + + hidden_arglist = chainon (hidden_arglist, tmp); + DECL_CONTEXT (tmp) = fndecl; + DECL_ARTIFICIAL (tmp) = 1; + DECL_ARG_TYPE (tmp) = boolean_type_node; + TREE_READONLY (tmp) = 1; + gfc_finish_decl (tmp); + } /* For non-constant length array arguments, make sure they use a different type node from TYPE_ARG_TYPES type. */ |