Warn about reference address as bool in condition of ?: and if (), too, not only...
[cparser] / type.c
diff --git a/type.c b/type.c
index ce14faa..3ab686d 100644 (file)
--- a/type.c
+++ b/type.c
@@ -295,28 +295,33 @@ void print_imaginary_type(const imaginary_type_t *type)
  */
 static void print_function_type_pre(const function_type_t *type, bool top)
 {
+       switch (type->linkage) {
+               case LINKAGE_INVALID:
+                       break;
+
+               case LINKAGE_C:
+                       if (c_mode & _CXX)
+                               fputs("extern \"C\" ",   out);
+                       break;
+
+               case LINKAGE_CXX:
+                       if (!(c_mode & _CXX))
+                               fputs("extern \"C++\" ", out);
+                       break;
+       }
+
        print_type_qualifiers(type->base.qualifiers);
        if (type->base.qualifiers != 0)
                fputc(' ', out);
 
-
        intern_print_type_pre(type->return_type, false);
 
        switch (type->calling_convention) {
-       case CC_CDECL:
-               fputs("__cdecl ", out);
-               break;
-       case CC_STDCALL:
-               fputs("__stdcall ", out);
-               break;
-       case CC_FASTCALL:
-               fputs("__fastcall ", out);
-               break;
-       case CC_THISCALL:
-               fputs("__thiscall ", out);
-               break;
-       case CC_DEFAULT:
-               break;
+       case CC_CDECL:    fputs("__cdecl ",    out); break;
+       case CC_STDCALL:  fputs("__stdcall ",  out); break;
+       case CC_FASTCALL: fputs("__fastcall ", out); break;
+       case CC_THISCALL: fputs("__thiscall ", out); break;
+       case CC_DEFAULT:  break;
        }
 
        /* don't emit parenthesis if we're the toplevel type... */
@@ -1029,6 +1034,9 @@ static bool function_types_compatible(const function_type_t *func1,
        if (!types_compatible(ret1, ret2))
                return false;
 
+       if (func1->linkage != func2->linkage)
+               return false;
+
        if (func1->calling_convention != func2->calling_convention)
                return false;