On Sun, May 12, 2019 at 12:47:04AM +0300, Janne Blomqvist wrote:
> When generating C prototypes for Fortran procedures with the
> -fc-prototypes and -fc-prototypes-external options, print a snippet
> defining macros for complex types, and add C++ support by suppressing
> mangling.
> 
> fortran/ChangeLog:
> 
> 2019-05-12  Janne Blomqvist  <j...@gcc.gnu.org>
> 
>       * dump-parse-tree.c (get_c_type_name): Use macros for complex type
>       names.
>       * parse.c (gfc_parse_file): Define complex macros, add CPP support
>       when printing C prototypes.
> 
> Ok for trunk?

Is it correct to use macros in user namespace?  Shouldn't they be say __
prefixed, or even have __GFC_ or __GFORTRAN_ in them?

> --- a/gcc/fortran/dump-parse-tree.c
> +++ b/gcc/fortran/dump-parse-tree.c
> @@ -3143,11 +3143,11 @@ get_c_type_name (gfc_typespec *ts, gfc_array_spec 
> *as, const char **pre,
>         else if (strcmp (*type_name, "size_t") == 0)
>           *type_name = "ssize_t";
>         else if (strcmp (*type_name, "float_complex") == 0)
> -         *type_name = "float complex";
> +         *type_name = "FLOAT_COMPLEX";
>         else if (strcmp (*type_name, "double_complex") == 0)
> -         *type_name = "double complex";
> +         *type_name = "DOUBLE_COMPLEX";
>         else if (strcmp (*type_name, "long_double_complex") == 0)
> -         *type_name = "long double complex";
> +         *type_name = "LONG_DOUBLE_COMPLEX";
>  
>         ret = T_OK;
>       }
> @@ -3166,11 +3166,11 @@ get_c_type_name (gfc_typespec *ts, gfc_array_spec 
> *as, const char **pre,
>                 else if (strcmp (*type_name, "size_t") == 0)
>                   *type_name = "ssize_t";
>                 else if (strcmp (*type_name, "float_complex") == 0)
> -                 *type_name = "float complex";
> +                 *type_name = "FLOAT_COMPLEX";
>                 else if (strcmp (*type_name, "double_complex") == 0)
> -                 *type_name = "double complex";
> +                 *type_name = "DOUBLE_COMPLEX";
>                 else if (strcmp (*type_name, "long_double_complex") == 0)
> -                 *type_name = "long double complex";
> +                 *type_name = "LONG_DOUBLE_COMPLEX";
>  
>                 ret = T_WARN;
>                 break;
> diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
> index 9d693595e20..8077da870b0 100644
> --- a/gcc/fortran/parse.c
> +++ b/gcc/fortran/parse.c
> @@ -6331,6 +6331,24 @@ done:
>        }
>  
>    /* Dump C prototypes.  */
> +  if (flag_c_prototypes || flag_c_prototypes_external)
> +    {
> +      fprintf (stdout,
> +            _("#include <stddef.h>\n"
> +              "#ifdef __cplusplus\n"
> +              "#include <complex>\n"
> +              "#define FLOAT_COMPLEX std::complex<float>\n"
> +              "#define DOUBLE_COMPLEX std::complex<double>\n"
> +              "#define LONG_DOUBLE_COMPLEX std::complex<long double>\n"
> +              "extern \"C\" {\n"
> +              "#else\n"
> +              "#define FLOAT_COMPLEX float _Complex\n"
> +              "#define DOUBLE_COMPLEX double _Complex\n"
> +              "#define LONG_DOUBLE_COMPLEX long double _Complex\n"
> +              "#endif\n\n"));
> +    }
> +
> +  /* First dump BIND(C) prototypes.  */
>    if (flag_c_prototypes)
>      {
>        for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns;
> @@ -6342,6 +6360,10 @@ done:
>    if (flag_c_prototypes_external)
>      gfc_dump_external_c_prototypes (stdout);
>  
> +  if (flag_c_prototypes || flag_c_prototypes_external)
> +    fprintf (stdout,
> +          _("\n#ifdef __cplusplus\n}\n#endif\n"));
> +
>    /* Do the translation.  */
>    translate_all_program_units (gfc_global_ns_list);
>  
> -- 
> 2.17.1

        Jakub

Reply via email to