]> granicus.if.org Git - clang/commitdiff
Some early declarations to support sentinel attribute on
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 13 May 2009 18:09:35 +0000 (18:09 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 13 May 2009 18:09:35 +0000 (18:09 +0000)
message dispatches (and function calls later). No change in
functionality.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71683 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Attr.h
lib/Frontend/PCHReaderDecl.cpp
lib/Frontend/PCHWriter.cpp
lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprObjC.cpp

index 287d80f93f4941932ace60e075c634f4c13400f9..feed54b7ecd5f296394da6c40724b16a8cba1dea 100644 (file)
@@ -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.
index e623b6f1d7d6eb8c54b293c77b58d44ad30d7a4f..3db00ec1b71f86dbd67abdcdc7e7e3e9ac0667fa 100644 (file)
@@ -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);
     
index dbe0e536e5578a3eb5327750542e4bec39195388..e05a73568f4ec0683f476289ea053e04e4e04e3c 100644 (file)
@@ -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:
index 2e617f573becadfe6b09a136f69f91a5a28e4599..8c38c2bfd2bb3582c5601935e5de45f2eb344513 100644 (file)
@@ -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;
index d2e84c10e222207bfb009e9c78a7d3fe0e5a05e9..f1da408669ca1e72196a2936cbee0f3ca224251e 100644 (file)
@@ -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();
index de6b69f90fbeee2d1e5013e370ece7ac5ec90a32..0073fd9f28f28952f066b0f71ebbc6faa2da7e53 100644 (file)
@@ -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;