forked from OSchip/llvm-project
Diagnose calling convention attribute incompatibilities. Fixes rdar://8876096.
llvm-svn: 124244
This commit is contained in:
parent
cd81fe033c
commit
4e52cc7de4
|
@ -2560,6 +2560,17 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state,
|
||||||
if (!unwrapped.isFunctionType())
|
if (!unwrapped.isFunctionType())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Diagnose regparm with fastcall.
|
||||||
|
const FunctionType *fn = unwrapped.get();
|
||||||
|
CallingConv CC = fn->getCallConv();
|
||||||
|
if (CC == CC_X86FastCall) {
|
||||||
|
S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
|
||||||
|
<< FunctionType::getNameForCallConv(CC)
|
||||||
|
<< "regparm";
|
||||||
|
attr.setInvalid();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
FunctionType::ExtInfo EI =
|
FunctionType::ExtInfo EI =
|
||||||
unwrapped.get()->getExtInfo().withRegParm(value);
|
unwrapped.get()->getExtInfo().withRegParm(value);
|
||||||
type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
|
type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
|
||||||
|
@ -2578,7 +2589,8 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state,
|
||||||
CallingConv CCOld = fn->getCallConv();
|
CallingConv CCOld = fn->getCallConv();
|
||||||
if (S.Context.getCanonicalCallConv(CC) ==
|
if (S.Context.getCanonicalCallConv(CC) ==
|
||||||
S.Context.getCanonicalCallConv(CCOld)) {
|
S.Context.getCanonicalCallConv(CCOld)) {
|
||||||
attr.setInvalid();
|
FunctionType::ExtInfo EI= unwrapped.get()->getExtInfo().withCallingConv(CC);
|
||||||
|
type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2607,6 +2619,15 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state,
|
||||||
attr.setInvalid();
|
attr.setInvalid();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Also diagnose fastcall with regparm.
|
||||||
|
if (fn->getRegParmType()) {
|
||||||
|
S.Diag(attr.getLoc(), diag::err_attributes_are_not_compatible)
|
||||||
|
<< "regparm"
|
||||||
|
<< FunctionType::getNameForCallConv(CC);
|
||||||
|
attr.setInvalid();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
|
FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
|
||||||
|
|
|
@ -8,3 +8,13 @@ int __attribute__((fastcall)) var2; // expected-warning{{'fastcall' only applies
|
||||||
void __attribute__((stdcall, fastcall)) foo3(void); // expected-error{{fastcall and stdcall attributes are not compatible}}
|
void __attribute__((stdcall, fastcall)) foo3(void); // expected-error{{fastcall and stdcall attributes are not compatible}}
|
||||||
void __attribute__((stdcall)) foo4(); // expected-note{{previous declaration is here}}
|
void __attribute__((stdcall)) foo4(); // expected-note{{previous declaration is here}}
|
||||||
void __attribute__((fastcall)) foo4(void); // expected-error{{function declared 'fastcall' here was previously declared 'stdcall'}}
|
void __attribute__((fastcall)) foo4(void); // expected-error{{function declared 'fastcall' here was previously declared 'stdcall'}}
|
||||||
|
|
||||||
|
// rdar://8876096
|
||||||
|
void rdar8876096foo1(int i, int j) __attribute__((fastcall, cdecl)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo2(int i, int j) __attribute__((fastcall, stdcall)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo3(int i, int j) __attribute__((fastcall, regparm(2))); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo4(int i, int j) __attribute__((stdcall, cdecl)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo5(int i, int j) __attribute__((stdcall, fastcall)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo6(int i, int j) __attribute__((cdecl, fastcall)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo7(int i, int j) __attribute__((cdecl, stdcall)); // expected-error {{not compatible}}
|
||||||
|
void rdar8876096foo8(int i, int j) __attribute__((regparm(2), fastcall)); // expected-error {{not compatible}}
|
||||||
|
|
Loading…
Reference in New Issue