aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h8
-rw-r--r--gcc/cp/tree.c19
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c5c40f8..5ca247b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-04 Jason Merrill <jason@redhat.com>
+
+ * tree.c (decl_storage_duration): New.
+ * cp-tree.h: Declare it.
+ (duration_kind): Return values.
+
2010-10-03 Jason Merrill <jason@redhat.com>
* typeck.c (require_complete_type_sfinae): Add complain parm to...
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