From patchwork Mon Oct 4 16:20:29 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: C++ PATCH to add decl_storage_duration Date: Mon, 04 Oct 2010 06:20:29 -0000 From: Jason Merrill X-Patchwork-Id: 66710 Message-Id: <4CA9FECD.2010606@redhat.com> To: gcc-patches List 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. commit 69828ddfbcbe5a791ed15fb304a2079364544617 Author: Jason Merrill 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