aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-06-07 16:42:37 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-06-07 16:42:37 -0400
commit01628e543b8867e4c4ca5724d4982caae7f0bc1a (patch)
tree162d7f5ea6f6051c882ece33106ad652f869918c /gcc
parent55cdb6b69069481ecf19ff07d0ebb23208bc8162 (diff)
downloadgcc-01628e543b8867e4c4ca5724d4982caae7f0bc1a.zip
gcc-01628e543b8867e4c4ca5724d4982caae7f0bc1a.tar.gz
gcc-01628e543b8867e4c4ca5724d4982caae7f0bc1a.tar.bz2
cp-tree.h (COMPLETE_OR_OPEN_TYPE_P): New macro.
* cp-tree.h (COMPLETE_OR_OPEN_TYPE_P): New macro. * init.c (build_offset_ref): Use it. * pt.c (maybe_process_partial_specialization): Use it. (instantiate_class_template): Use it. * search.c (lookup_base): Use it. From-SVN: r160398
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h5
-rw-r--r--gcc/cp/init.c3
-rw-r--r--gcc/cp/pt.c8
-rw-r--r--gcc/cp/search.c3
5 files changed, 16 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7119ddd..3220230 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2010-06-07 Jason Merrill <jason@redhat.com>
+ * cp-tree.h (COMPLETE_OR_OPEN_TYPE_P): New macro.
+ * init.c (build_offset_ref): Use it.
+ * pt.c (maybe_process_partial_specialization): Use it.
+ (instantiate_class_template): Use it.
+ * search.c (lookup_base): Use it.
+
* pt.c (lookup_template_class): Don't mess with
DECL_TEMPLATE_INSTANTIATIONS except for partial instantiations.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 5efe279..f507a21 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1433,6 +1433,11 @@ struct GTY(()) lang_type {
starting the definition of this type has been seen. */
#define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined)
+/* Nonzero means that this type is either complete or being defined, so we
+ can do lookup in it. */
+#define COMPLETE_OR_OPEN_TYPE_P(NODE) \
+ (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE)))
+
/* Mark bits for repeated base checks. */
#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 1f3e803..66451b1 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1520,8 +1520,7 @@ build_offset_ref (tree type, tree member, bool address_p)
/* Callers should call mark_used before this point. */
gcc_assert (!DECL_P (member) || TREE_USED (member));
- if (!COMPLETE_TYPE_P (complete_type (type))
- && !TYPE_BEING_DEFINED (type))
+ if (!COMPLETE_OR_OPEN_TYPE_P (complete_type (type)))
{
error ("incomplete type %qT does not have member %qD", type, member);
return error_mark_node;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index fd93b1b..b62a9bc 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -891,7 +891,7 @@ maybe_process_partial_specialization (tree type)
*slot = GGC_NEW (spec_entry);
**slot = elt;
}
- else if (COMPLETE_TYPE_P (inst) || TYPE_BEING_DEFINED (inst))
+ else if (COMPLETE_OR_OPEN_TYPE_P (inst))
/* But if we've had an implicit instantiation, that's a
problem ([temp.expl.spec]/6). */
error ("specialization %qT after instantiation %qT",
@@ -7700,8 +7700,7 @@ instantiate_class_template (tree type)
if (type == error_mark_node)
return error_mark_node;
- if (TYPE_BEING_DEFINED (type)
- || COMPLETE_TYPE_P (type)
+ if (COMPLETE_OR_OPEN_TYPE_P (type)
|| uses_template_parms (type))
return type;
@@ -7796,8 +7795,7 @@ instantiate_class_template (tree type)
instantiate it, and that lookup should instantiate the enclosing
class. */
gcc_assert (!DECL_CLASS_SCOPE_P (TYPE_MAIN_DECL (pattern))
- || COMPLETE_TYPE_P (TYPE_CONTEXT (type))
- || TYPE_BEING_DEFINED (TYPE_CONTEXT (type)));
+ || COMPLETE_OR_OPEN_TYPE_P (TYPE_CONTEXT (type)));
base_list = NULL_TREE;
if (BINFO_N_BASE_BINFOS (pbinfo))
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index e308821..d69d415 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -216,8 +216,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
/* If BASE is incomplete, it can't be a base of T--and instantiating it
might cause an error. */
- if (t_binfo && CLASS_TYPE_P (base)
- && (COMPLETE_TYPE_P (base) || TYPE_BEING_DEFINED (base)))
+ if (t_binfo && CLASS_TYPE_P (base) && COMPLETE_OR_OPEN_TYPE_P (base))
{
struct lookup_base_data_s data;