/* We cannot specify fastcall for variadic functions */
if ((F->Flags & FD_VARIADIC) && (Qualifiers & T_QUAL_FASTCALL)) {
- Error ("Variadic functions cannot be `__fastcall__'");
+ Error ("Variadic functions cannot be __fastcall__");
Qualifiers &= ~T_QUAL_FASTCALL;
}
return;
}
}
+
+ if (LeftType == T_TYPE_FUNC) {
+ /* If a calling convention wasn't set explicitly,
+ ** then assume the default one.
+ */
+ if ((LeftQual & T_QUAL_CCONV) == T_QUAL_NONE) {
+ LeftQual |= (AutoCDecl || IsVariadicFunc (lhs)) ? T_QUAL_CDECL : T_QUAL_FASTCALL;
+ }
+ if ((RightQual & T_QUAL_CCONV) == T_QUAL_NONE) {
+ RightQual |= (AutoCDecl || IsVariadicFunc (rhs)) ? T_QUAL_CDECL : T_QUAL_FASTCALL;
+ }
+ }
+
if (LeftQual != RightQual) {
/* On the first indirection level, different qualifiers mean
** that the types still are compatible. On the second level,
SetResult (Result, TC_STRICT_COMPATIBLE);
}
- if (LeftType != T_TYPE_FUNC) {
- break;
- }
-
- /* If a calling convention wasn't set explicitly,
- ** then assume the default one.
- */
- LeftQual &= T_QUAL_CCONV;
- if (LeftQual == T_QUAL_NONE) {
- LeftQual = (AutoCDecl || IsVariadicFunc (lhs)) ? T_QUAL_CDECL : T_QUAL_FASTCALL;
- }
- RightQual &= T_QUAL_CCONV;
- if (RightQual == T_QUAL_NONE) {
- RightQual = (AutoCDecl || IsVariadicFunc (rhs)) ? T_QUAL_CDECL : T_QUAL_FASTCALL;
- }
-
- if (LeftQual == RightQual) {
+ if (LeftType != T_TYPE_FUNC || (LeftQual & T_QUAL_CCONV) == (RightQual & T_QUAL_CCONV)) {
break;
}
/* else fall through */