aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/class.cc2
-rw-r--r--gcc/cp/cp-tree.h19
-rw-r--r--gcc/cp/decl.cc2
-rw-r--r--gcc/cp/lambda.cc2
-rw-r--r--gcc/cp/module.cc10
5 files changed, 26 insertions, 9 deletions
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc
index 9a41c00..151ee2b 100644
--- a/gcc/cp/class.cc
+++ b/gcc/cp/class.cc
@@ -7452,7 +7452,7 @@ determine_key_method (tree type)
&& ! DECL_DECLARED_INLINE_P (method)
&& ! DECL_PURE_VIRTUAL_P (method))
{
- CLASSTYPE_KEY_METHOD (type) = method;
+ SET_CLASSTYPE_KEY_METHOD (type, method);
break;
}
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 4370573..9081628 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2519,11 +2519,11 @@ struct GTY(()) lang_type {
vec<tree, va_gc> *pure_virtuals;
tree friend_classes;
vec<tree, va_gc> * GTY((reorder ("resort_type_member_vec"))) members;
+ /* CLASSTYPE_KEY_METHOD for TYPE_POLYMORPHIC_P types, CLASSTYPE_LAMBDA_EXPR
+ otherwise. */
tree key_method;
tree decl_list;
tree befriending_classes;
- /* FIXME reuse another field? */
- tree lambda_expr;
union maybe_objc_info {
/* If not c_dialect_objc, this part is not even allocated. */
char GTY((tag ("0"))) non_objc;
@@ -2646,7 +2646,13 @@ struct GTY(()) lang_type {
/* The member function with which the vtable will be emitted:
the first noninline non-pure-virtual member function. NULL_TREE
if there is no key function or if this is a class template */
-#define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method)
+#define CLASSTYPE_KEY_METHOD(NODE) \
+ (TYPE_POLYMORPHIC_P (NODE) \
+ ? LANG_TYPE_CLASS_CHECK (NODE)->key_method \
+ : NULL_TREE)
+#define SET_CLASSTYPE_KEY_METHOD(NODE, VALUE) \
+ (gcc_checking_assert (TYPE_POLYMORPHIC_P (NODE)), \
+ LANG_TYPE_CLASS_CHECK (NODE)->key_method = (VALUE))
/* Vector of members. During definition, it is unordered and only
member functions are present. After completion it is sorted and
@@ -2778,7 +2784,12 @@ struct GTY(()) lang_type {
/* The associated LAMBDA_EXPR that made this class. */
#define CLASSTYPE_LAMBDA_EXPR(NODE) \
- (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr)
+ (TYPE_POLYMORPHIC_P (NODE) \
+ ? NULL_TREE \
+ : LANG_TYPE_CLASS_CHECK (NODE)->key_method)
+#define SET_CLASSTYPE_LAMBDA_EXPR(NODE, VALUE) \
+ (gcc_checking_assert (!TYPE_POLYMORPHIC_P (NODE)), \
+ LANG_TYPE_CLASS_CHECK (NODE)->key_method = (VALUE))
/* The extra mangling scope for this closure type. */
#define LAMBDA_TYPE_EXTRA_SCOPE(NODE) \
(LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE)))
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 664dbbe..843f0e4 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -17289,7 +17289,7 @@ xref_tag (enum tag_types tag_code, tree name,
if (IDENTIFIER_LAMBDA_P (name))
/* Mark it as a lambda type right now. Our caller will
correct the value. */
- CLASSTYPE_LAMBDA_EXPR (t) = error_mark_node;
+ SET_CLASSTYPE_LAMBDA_EXPR (t, error_mark_node);
t = pushtag (name, t, how);
}
else
diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
index 182cffa..525e8ef 100644
--- a/gcc/cp/lambda.cc
+++ b/gcc/cp/lambda.cc
@@ -150,7 +150,7 @@ begin_lambda_type (tree lambda)
/* Cross-reference the expression and the type. */
LAMBDA_EXPR_CLOSURE (lambda) = type;
- CLASSTYPE_LAMBDA_EXPR (type) = lambda;
+ SET_CLASSTYPE_LAMBDA_EXPR (type, lambda);
/* In C++17, assume the closure is literal; we'll clear the flag later if
necessary. */
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 6b5a60a..689319a 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -13393,13 +13393,19 @@ trees_in::read_class_def (tree defn, tree maybe_template)
if (TYPE_LANG_SPECIFIC (type))
{
- CLASSTYPE_LAMBDA_EXPR (type) = lambda;
+ if (!TYPE_POLYMORPHIC_P (type))
+ SET_CLASSTYPE_LAMBDA_EXPR (type, lambda);
+ else
+ gcc_checking_assert (lambda == NULL_TREE);
CLASSTYPE_MEMBER_VEC (type) = member_vec;
CLASSTYPE_PURE_VIRTUALS (type) = pure_virts;
CLASSTYPE_VCALL_INDICES (type) = vcall_indices;
- CLASSTYPE_KEY_METHOD (type) = key_method;
+ if (TYPE_POLYMORPHIC_P (type))
+ SET_CLASSTYPE_KEY_METHOD (type, key_method);
+ else
+ gcc_checking_assert (key_method == NULL_TREE);
CLASSTYPE_VBASECLASSES (type) = vbase_vec;