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.

llvm-svn: 46216
This commit is contained in:
Duncan Sands 2008-01-21 21:37:41 +00:00
parent eab81cd03f
commit 92a56b5499
1 changed files with 1 additions and 6 deletions

View File

@ -200,14 +200,9 @@ uint16_t ParamAttr::typeIncompatible (const Type *Ty) {
// Attributes that only apply to integers.
Incompatible |= SExt | ZExt;
if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
if (!PTy->getElementType()->isSized())
// The byval and sret attributes only apply to pointers to sized types.
Incompatible |= ByVal | StructRet;
} else {
if (!isa<PointerType>(Ty))
// Attributes that only apply to pointers.
Incompatible |= ByVal | Nest | NoAlias | StructRet;
}
return Incompatible;
}