*/
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... */
if (!types_compatible(ret1, ret2))
return false;
+ if (func1->linkage != func2->linkage)
+ return false;
+
if (func1->calling_convention != func2->calling_convention)
return false;