mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
It turns out that in C++ it is legal to declare functions
that return an opaque type by value, as long as you don't call it or provide a body (you can take the address of it). So it is wrong to insist that sret parameters not be an opaque*. And I guess it is really up to codegen to complain if someone tries to call such a function. I'm also removing the analogous check from byval parameters, since I don't see why we shouldn't allow them as long as no-one tries to call the function or give it a body. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46216 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e5d53f5fe8
commit
03531a4816
@ -200,14 +200,9 @@ uint16_t ParamAttr::typeIncompatible (const Type *Ty) {
|
|||||||
// Attributes that only apply to integers.
|
// Attributes that only apply to integers.
|
||||||
Incompatible |= SExt | ZExt;
|
Incompatible |= SExt | ZExt;
|
||||||
|
|
||||||
if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
|
if (!isa<PointerType>(Ty))
|
||||||
if (!PTy->getElementType()->isSized())
|
|
||||||
// The byval and sret attributes only apply to pointers to sized types.
|
|
||||||
Incompatible |= ByVal | StructRet;
|
|
||||||
} else {
|
|
||||||
// Attributes that only apply to pointers.
|
// Attributes that only apply to pointers.
|
||||||
Incompatible |= ByVal | Nest | NoAlias | StructRet;
|
Incompatible |= ByVal | Nest | NoAlias | StructRet;
|
||||||
}
|
|
||||||
|
|
||||||
return Incompatible;
|
return Incompatible;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user