aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2019-05-12 11:26:18 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2019-05-12 11:26:18 +0300
commit4c0164573e213045052ca6bc3113d7d63cf62816 (patch)
tree99ca3a0763fbd7cf9794ed6e1f3e21c43d3e7968 /gcc
parent1fa26ccd67ea2b458f4fb9ba8779c11059353d0f (diff)
downloadgcc-4c0164573e213045052ca6bc3113d7d63cf62816.zip
gcc-4c0164573e213045052ca6bc3113d7d63cf62816.tar.gz
gcc-4c0164573e213045052ca6bc3113d7d63cf62816.tar.bz2
fortran: C++ support for generating C prototypes
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 <jb@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. From-SVN: r271106
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/dump-parse-tree.c12
-rw-r--r--gcc/fortran/parse.c22
3 files changed, 35 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0198637..512e632 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2019-05-12 Janne Blomqvist <jb@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.
+
2019-05-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/61968
diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 54af5df..41b2c88 100644
--- 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 = "__GFORTRAN_FLOAT_COMPLEX";
else if (strcmp (*type_name, "double_complex") == 0)
- *type_name = "double complex";
+ *type_name = "__GFORTRAN_DOUBLE_COMPLEX";
else if (strcmp (*type_name, "long_double_complex") == 0)
- *type_name = "long double complex";
+ *type_name = "__GFORTRAN_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 = "__GFORTRAN_FLOAT_COMPLEX";
else if (strcmp (*type_name, "double_complex") == 0)
- *type_name = "double complex";
+ *type_name = "__GFORTRAN_DOUBLE_COMPLEX";
else if (strcmp (*type_name, "long_double_complex") == 0)
- *type_name = "long double complex";
+ *type_name = "__GFORTRAN_LONG_DOUBLE_COMPLEX";
ret = T_WARN;
break;
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 9d69359..155534c 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 __GFORTRAN_FLOAT_COMPLEX std::complex<float>\n"
+ "#define __GFORTRAN_DOUBLE_COMPLEX std::complex<double>\n"
+ "#define __GFORTRAN_LONG_DOUBLE_COMPLEX std::complex<long double>\n"
+ "extern \"C\" {\n"
+ "#else\n"
+ "#define __GFORTRAN_FLOAT_COMPLEX float _Complex\n"
+ "#define __GFORTRAN_DOUBLE_COMPLEX double _Complex\n"
+ "#define __GFORTRAN_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);