]> granicus.if.org Git - clang/commitdiff
Added the following utility methods to VarDecl that provide
authorTed Kremenek <kremenek@apple.com>
Wed, 15 Aug 2007 00:03:46 +0000 (00:03 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 15 Aug 2007 00:03:46 +0000 (00:03 +0000)
canonicalized queries of a variable's storage:

  hasAutoStorage - Does a variable have (implicit) auto storage?

  hasStaticStorage - Does a variable have (implicit) static storage?

  hasLocalStorage - Is the variable a non-static local variable?

  hasGlobalStorage - Is the variable a global variable or a static
                     local variable?

Additional comments documenting these functions are included in the
source.

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

include/clang/AST/Decl.h

index 90af50c36fa1ae468510ca23e7826752fabefc9d..f94e126cb52b470b2909c5993fd67450a6df2a92 100644 (file)
@@ -151,6 +151,33 @@ public:
   Expr *getInit() { return Init; }
   void setInit(Expr *I) { Init = I; }
   
+  // hasAutoStorage - Returns true if either the implicit or explicit
+  //  storage class of a variable is "auto."  In particular, variables
+  //  declared within a function that lack a storage keyword are
+  //  implicitly "auto", but are represented internally with a storage
+  //  class of None.
+  bool hasAutoStorage() {
+    return (SClass == Auto || (SClass == None && getKind() == BlockVariable));
+  }
+
+  // hasStaticStorage - Returns true if either the implicit or
+  //  explicit storage class of a variable is "static."  In
+  //  particular, variables declared within a file (outside of a
+  //  function) that lack a storage keyword are implicitly "static,"
+  //  but are represented internally with a storage class of "None".
+  bool hasStaticStorage() {
+    return (SClass == Static || (SClass == None && getKind() == FileVariable));
+  }
+      
+  // hasLocalStorage - Returns true if a variable with function scope
+  //  is a non-static local variable.
+  bool hasLocalStorage() { return (hasAutoStorage() || SClass == Register); }
+
+  // hasGlobalStorage - Returns true for all variables that do not
+  //  have local storage.  This includs all global variables as well
+  //  as static variables declared within a function.
+  bool hasGlobalStorage() { return !hasAutoStorage(); }
+  
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { 
     return D->getKind() >= BlockVariable && D->getKind() <= ParmVariable;