Commit bab5167f by Jason Merrill Committed by Jason Merrill

re PR c++/54277 (Template class member referred to with implicit this inside…

re PR c++/54277 (Template class member referred to with implicit this inside lambda is incorrectly const-qualified)

	PR c++/54277
	* cp-tree.h (WILDCARD_TYPE_P): Split out from...
	(MAYBE_CLASS_TYPE_P): ...here.
	* semantics.c (lambda_capture_field_type): Only build a
	magic decltype for wildcard types.
	(lambda_proxy_type): Likewise.
	(finish_non_static_data_member): Get the quals from
	the object.

From-SVN: r196747
parent d14d53ad
2013-03-16 Jason Merrill <jason@redhat.com>
PR c++/54277
* cp-tree.h (WILDCARD_TYPE_P): Split out from...
(MAYBE_CLASS_TYPE_P): ...here.
* semantics.c (lambda_capture_field_type): Only build a
magic decltype for wildcard types.
(lambda_proxy_type): Likewise.
(finish_non_static_data_member): Get the quals from
the object.
PR c++/55931
* parser.c (cp_parser_template_argument): Don't
fold_non_dependent_expr.
......
......@@ -1220,17 +1220,20 @@ enum languages { lang_c, lang_cplusplus, lang_java };
/* The _DECL for this _TYPE. */
#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
/* Nonzero if T is a class (or struct or union) type. Also nonzero
for template type parameters, typename types, and instantiated
template template parameters. Keep these checks in ascending code
order. */
#define MAYBE_CLASS_TYPE_P(T) \
/* Nonzero if T is a type that could resolve to any kind of concrete type
at instantiation time. */
#define WILDCARD_TYPE_P(T) \
(TREE_CODE (T) == TEMPLATE_TYPE_PARM \
|| TREE_CODE (T) == TYPENAME_TYPE \
|| TREE_CODE (T) == TYPEOF_TYPE \
|| TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \
|| TREE_CODE (T) == DECLTYPE_TYPE \
|| CLASS_TYPE_P (T))
|| TREE_CODE (T) == DECLTYPE_TYPE)
/* Nonzero if T is a class (or struct or union) type. Also nonzero
for template type parameters, typename types, and instantiated
template template parameters. Keep these checks in ascending code
order. */
#define MAYBE_CLASS_TYPE_P(T) (WILDCARD_TYPE_P (T) || CLASS_TYPE_P (T))
/* Set CLASS_TYPE_P for T to VAL. T must be a class, struct, or
union type. */
......
......@@ -1574,9 +1574,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
else
{
/* Set the cv qualifiers. */
int quals = (current_class_ref
? cp_type_quals (TREE_TYPE (current_class_ref))
: TYPE_UNQUALIFIED);
int quals = cp_type_quals (TREE_TYPE (object));
if (DECL_MUTABLE_P (decl))
quals &= ~TYPE_QUAL_CONST;
......@@ -9056,7 +9054,7 @@ tree
lambda_capture_field_type (tree expr)
{
tree type;
if (type_dependent_expression_p (expr))
if (!TREE_TYPE (expr) || WILDCARD_TYPE_P (TREE_TYPE (expr)))
{
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = expr;
......@@ -9265,7 +9263,7 @@ lambda_proxy_type (tree ref)
if (REFERENCE_REF_P (ref))
ref = TREE_OPERAND (ref, 0);
type = TREE_TYPE (ref);
if (!dependent_type_p (type))
if (type && !WILDCARD_TYPE_P (type))
return type;
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = ref;
......
// PR c++/54277
// { dg-do compile { target c++11 } }
struct Used
{
void foo() { }
};
template <typename>
struct S
{
Used x;
void bar()
{
auto f = [this] { x.foo(); };
f();
}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment