From b95ca5135eb61adb45e38d837808418ed9334b88 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 4 Oct 2010 12:18:03 -0400 Subject: tree.c (decl_storage_duration): New. * tree.c (decl_storage_duration): New. * cp-tree.h: Declare it. (duration_kind): Return values. From-SVN: r164944 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-tree.h | 8 ++++++++ gcc/cp/tree.c | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+) (limited to 'gcc') 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 + + * tree.c (decl_storage_duration): New. + * cp-tree.h: Declare it. + (duration_kind): Return values. + 2010-10-03 Jason Merrill * 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 -- cgit v1.1