This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH to add decl_storage_duration
- From: Jason Merrill <jason at redhat dot com>
- To: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 04 Oct 2010 12:20:29 -0400
- Subject: C++ PATCH to add decl_storage_duration
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 <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