forked from OSchip/llvm-project
Some early declarations to support sentinel attribute on
message dispatches (and function calls later). No change in functionality. llvm-svn: 71683
This commit is contained in:
parent
784ae669ab
commit
027b886a99
|
@ -66,6 +66,7 @@ public:
|
|||
Pure,
|
||||
Regparm,
|
||||
Section,
|
||||
Sentinel,
|
||||
StdCall,
|
||||
TransparentUnion,
|
||||
Unavailable,
|
||||
|
@ -359,6 +360,23 @@ public:
|
|||
static bool classof(const FormatAttr *A) { return true; }
|
||||
};
|
||||
|
||||
class SentinelAttr : public Attr {
|
||||
int sentinel, NullPos;
|
||||
public:
|
||||
SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel),
|
||||
sentinel(sentinel_val), NullPos(nullPos) {}
|
||||
int getSentinel() const { return sentinel; }
|
||||
int getNullPos() const { return NullPos; }
|
||||
|
||||
virtual Attr *clone(ASTContext &C) const {
|
||||
return ::new (C) SentinelAttr(sentinel, NullPos);
|
||||
}
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Attr *A) { return A->getKind() == Sentinel; }
|
||||
static bool classof(const SentinelAttr *A) { return true; }
|
||||
};
|
||||
|
||||
class VisibilityAttr : public Attr {
|
||||
public:
|
||||
/// @brief An enumeration for the kinds of visibility of symbols.
|
||||
|
|
|
@ -452,6 +452,13 @@ Attr *PCHReader::ReadAttributes() {
|
|||
New = ::new (*Context) FormatAttr(Type, FormatIdx, FirstArg);
|
||||
break;
|
||||
}
|
||||
|
||||
case Attr::Sentinel: {
|
||||
int sentinel = Record[Idx++];
|
||||
int nullPos = Record[Idx++];
|
||||
New = ::new (*Context) SentinelAttr(sentinel, nullPos);
|
||||
break;
|
||||
}
|
||||
|
||||
SIMPLE_ATTR(GNUInline);
|
||||
|
||||
|
|
|
@ -1556,6 +1556,13 @@ void PCHWriter::WriteAttributeRecord(const Attr *Attr) {
|
|||
break;
|
||||
}
|
||||
|
||||
case Attr::Sentinel : {
|
||||
const SentinelAttr *Sentinel = cast<SentinelAttr>(Attr);
|
||||
Record.push_back(Sentinel->getSentinel());
|
||||
Record.push_back(Sentinel->getNullPos());
|
||||
break;
|
||||
}
|
||||
|
||||
case Attr::GNUInline:
|
||||
case Attr::IBOutletKind:
|
||||
case Attr::NoReturn:
|
||||
|
|
|
@ -1274,6 +1274,8 @@ public:
|
|||
bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD,
|
||||
ObjCMethodDecl *Getter,
|
||||
SourceLocation Loc);
|
||||
void DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
|
||||
Expr **Args, unsigned NumArgs);
|
||||
|
||||
// Primary Expressions.
|
||||
virtual SourceRange getExprRange(ExprTy *E) const;
|
||||
|
|
|
@ -88,6 +88,15 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc) {
|
|||
return false;
|
||||
}
|
||||
|
||||
/// DiagnoseSentinelCalls - This routine checks on method dispatch calls
|
||||
/// (and other functions in future), which have been declared with sentinel
|
||||
/// attribute. It warns if call does not have the sentinel argument.
|
||||
///
|
||||
void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
|
||||
Expr **Args, unsigned NumArgs)
|
||||
{
|
||||
}
|
||||
|
||||
SourceRange Sema::getExprRange(ExprTy *E) const {
|
||||
Expr *Ex = (Expr *)E;
|
||||
return Ex? Ex->getSourceRange() : SourceRange();
|
||||
|
|
|
@ -626,6 +626,8 @@ Sema::ExprResult Sema::ActOnInstanceMessage(ExprTy *receiver, Selector Sel,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (Method)
|
||||
DiagnoseSentinelCalls(Method, receiverLoc, ArgExprs, NumArgs);
|
||||
if (CheckMessageArgumentTypes(ArgExprs, NumArgs, Sel, Method, false,
|
||||
lbrac, rbrac, returnType))
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue