diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2005-05-11 00:06:55 +0200 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2005-05-11 00:06:55 +0200 |
commit | 973ff4c052b6feae740fbd3c5adcdaf1cf06ec47 (patch) | |
tree | 6cff06cdd4e25eaf7ccb4278260ebfd2d406f4f9 /gcc/fortran/trans-decl.c | |
parent | d096725d2690b6885df1e958778905fb9ac05720 (diff) | |
download | gcc-973ff4c052b6feae740fbd3c5adcdaf1cf06ec47.zip gcc-973ff4c052b6feae740fbd3c5adcdaf1cf06ec47.tar.gz gcc-973ff4c052b6feae740fbd3c5adcdaf1cf06ec47.tar.bz2 |
re PR fortran/20178 (COMPLEX function returns incompatible with g77)
gcc/fortran/
PR fortran/20178
* gfortran.h (gfc_option): Add flag_f2c.
* invoke.texi: Document '-ff2c' command line option. Adapt
documentation for '-fno-second-underscore' and '-fno-underscoring'.
* lang.opt (ff2c): New entry.
* options.c (gfc-init_options): Set default calling convention
to -fno-f2c. Mark -fsecond-underscore unset.
(gfc_post_options): Set -fsecond-underscore if not explicitly set
by user.
(handle_options): Set gfc_option.flag_f2c according to requested
calling convention.
* trans-decl.c (gfc_get_extern_function_decl): Use special f2c
intrinsics where necessary.
(gfc_trans_deferred_vars): Change todo error to assertion.
* trans-expr.c (gfc_conv_variable): Dereference access
to hidden result argument.
(gfc_conv_function_call): Add hidden result argument to argument
list if f2c calling conventions requested. Slightly restructure
tests. Convert result of default REAL function to requested type
if f2c calling conventions are used. Dereference COMPLEX result
if f2c cc are used.
* trans-types.c (gfc_sym_type): Return double for default REAL
function if f2c cc are used.
(gfc_return_by_reference): Slightly restructure logic. Return
COMPLEX by reference depending on calling conventions.
(gfc_get_function_type): Correctly make hidden result argument a
pass-by-reference argument for COMPLEX. Remove old code which does
this for derived types.
libgfortran/
PR fortran/20178
* Makefile.am (gfor_specific_src): Add 'intrinsics/f2c_intrinsics.F90'
to dependencies.
* Makefile.in: Regenerate.
* intrinsics/f2c_specific.F90: New file.
gcc/testsuite/
PR fortran/20178
* gfortran.dg/f2c_1.f90, gfortran.dg/f2c_2.f90,
gfortran.dg/f2c_3.f90: New tests.
From-SVN: r99544
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index d5075b9..3d89eff 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -901,7 +901,7 @@ gfc_get_extern_function_decl (gfc_symbol * sym) gfc_expr e; gfc_intrinsic_sym *isym; gfc_expr argexpr; - char s[GFC_MAX_SYMBOL_LEN]; + char s[GFC_MAX_SYMBOL_LEN + 13]; /* "f2c_specific" and '\0'. */ tree name; tree mangled_name; @@ -937,7 +937,18 @@ gfc_get_extern_function_decl (gfc_symbol * sym) gcc_assert (isym->formal->next->next == NULL); isym->resolve.f2 (&e, &argexpr, NULL); } - sprintf (s, "specific%s", e.value.function.name); + + if (gfc_option.flag_f2c + && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind) + || e.ts.type == BT_COMPLEX)) + { + /* Specific which needs a different implementation if f2c + calling conventions are used. */ + sprintf (s, "f2c_specific%s", e.value.function.name); + } + else + sprintf (s, "specific%s", e.value.function.name); + name = get_identifier (s); mangled_name = name; } @@ -2030,7 +2041,8 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) fnbody = gfc_trans_dummy_character (proc_sym->ts.cl, fnbody); } else - gfc_todo_error ("Deferred non-array return by reference"); + gcc_assert (gfc_option.flag_f2c + && proc_sym->ts.type == BT_COMPLEX); } for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink) |