Patchwork C++ PATCH to add decl_storage_duration

login
register
mail settings
Submitter Jason Merrill
Date Oct. 4, 2010, 4:20 p.m.
Message ID <4CA9FECD.2010606@redhat.com>
Download mbox | patch
Permalink /patch/66710/
State New
Headers show

Comments

Jason Merrill - Oct. 4, 2010, 4:20 p.m.
The constexpr code wants to look at the storage duration of a decl, and 
it seemed odd to me that there wasn't already a function for that.  This 
function isn't currently used by anything, but it is used by the 
constexpr code that I'll be merging in soon.

Tested x86_64-pc-linux-gnu, applied to trunk.

Patch

commit 69828ddfbcbe5a791ed15fb304a2079364544617
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Oct 4 10:00:11 2010 -0400

    	* tree.c (decl_storage_duration): New.
    	* cp-tree.h: Declare it.
    	(duration_kind): Return values.

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 6ce10e6..fa62570 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3934,6 +3934,13 @@  typedef enum linkage_kind {
   lk_external			/* External linkage.  */
 } linkage_kind;
 
+typedef enum duration_kind {
+  dk_static,
+  dk_thread,
+  dk_auto,
+  dk_dynamic
+} duration_kind;
+
 /* Bitmask flags to control type substitution.  */
 enum tsubst_flags {
   tf_none = 0,			 /* nothing special */
@@ -5402,6 +5409,7 @@  extern int count_trees				(tree);
 extern int char_type_p				(tree);
 extern void verify_stmt_tree			(tree);
 extern linkage_kind decl_linkage		(tree);
+extern duration_kind decl_storage_duration	(tree);
 extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
 			      void*, struct pointer_set_t*);
 #define cp_walk_tree(a,b,c,d) \
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ddfb354..174500e 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2985,6 +2985,25 @@  decl_linkage (tree decl)
   /* Everything else has internal linkage.  */
   return lk_internal;
 }
+
+/* Returns the storage duration of the object or reference associated with
+   the indicated DECL, which should be a VAR_DECL or PARM_DECL.  */
+
+duration_kind
+decl_storage_duration (tree decl)
+{
+  if (TREE_CODE (decl) == PARM_DECL)
+    return dk_auto;
+  if (TREE_CODE (decl) == FUNCTION_DECL)
+    return dk_static;
+  gcc_assert (TREE_CODE (decl) == VAR_DECL);
+  if (!TREE_STATIC (decl)
+      && !DECL_EXTERNAL (decl))
+    return dk_auto;
+  if (DECL_THREAD_LOCAL_P (decl))
+    return dk_thread;
+  return dk_static;
+}
 
 /* EXP is an expression that we want to pre-evaluate.  Returns (in
    *INITP) an expression that will perform the pre-evaluation.  The