}
/* The new for initialization statement. */
+ if (expansion_stmt_p && !TYPE_REF_P (iter_type))
+ iter_type = cp_build_qualified_type (iter_type, TYPE_QUAL_CONST);
tree begin = build_decl (loc, VAR_DECL, for_begin__identifier, iter_type);
TREE_USED (begin) = 1;
DECL_ARTIFICIAL (begin) = 1;
LOOKUP_ONLYCONVERTING);
if (cxx_dialect >= cxx17)
- iter_type = cv_unqualified (TREE_TYPE (end_expr));
+ {
+ iter_type = cv_unqualified (TREE_TYPE (end_expr));
+ if (expansion_stmt_p && !TYPE_REF_P (iter_type))
+ iter_type = cp_build_qualified_type (iter_type, TYPE_QUAL_CONST);
+ }
tree end = build_decl (loc, VAR_DECL, for_end__identifier, iter_type);
TREE_USED (end) = 1;
DECL_ARTIFICIAL (end) = 1;
begin = cp_build_range_for_decls (loc, expansion_init, &end, true);
if (!error_operand_p (begin) && !error_operand_p (end))
{
- tree i = get_target_expr (begin);
+ tree i
+ = build_target_expr_with_type (begin,
+ cv_unqualified (TREE_TYPE (begin)),
+ tf_warning_or_error);
tree w = build_stmt (loc, WHILE_STMT, NULL_TREE, NULL_TREE,
NULL_TREE, NULL_TREE, NULL_TREE);
tree r = get_target_expr (build_zero_cst (ptrdiff_type_node));
destruct_decls.safe_grow (n, true);
for (unsigned HOST_WIDE_INT i = 0; i < n; ++i)
{
- tree this_decl = build_decl (loc, VAR_DECL, NULL_TREE, make_auto ());
+ tree this_type = make_auto ();
+ if (DECL_DECLARED_CONSTEXPR_P (decl))
+ this_type = cp_build_qualified_type (this_type, TYPE_QUAL_CONST);
+ tree this_decl = build_decl (loc, VAR_DECL, NULL_TREE, this_type);
TREE_USED (this_decl) = 1;
DECL_ARTIFICIAL (this_decl) = 1;
DECL_DECLARED_CONSTEXPR_P (this_decl)
tree type = TREE_TYPE (range_decl);
if (args)
type = tsubst (type, args, complain | tf_tst_ok, in_decl);
+ if (DECL_DECLARED_CONSTEXPR_P (range_decl) && !TYPE_REF_P (type))
+ type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
tree decl = build_decl (loc, VAR_DECL, DECL_NAME (range_decl), type);
DECL_ATTRIBUTES (decl) = DECL_ATTRIBUTES (range_decl);
TREE_USED (decl) |= TREE_USED (range_decl);
tf_warning_or_error);
auto_node = make_auto ();
iter_type = do_auto_deduction (auto_node, iter_init, auto_node);
+ if (!TYPE_REF_P (iter_type))
+ iter_type = cp_build_qualified_type (iter_type, TYPE_QUAL_CONST);
iter = build_decl (loc, VAR_DECL, NULL_TREE, iter_type);
TREE_USED (iter) = 1;
DECL_ARTIFICIAL (iter) = 1;
this_decomp.count = TREE_VEC_LENGTH (v) - 1;
for (unsigned i = 0; i < this_decomp.count; ++i)
{
+ tree this_type = make_auto ();
+ if (DECL_DECLARED_CONSTEXPR_P (decl))
+ this_type = cp_build_qualified_type (this_type,
+ TYPE_QUAL_CONST);
tree this_decl
= build_decl (loc, VAR_DECL,
DECL_NAME (TREE_VEC_ELT (v, i + 1)),
- make_auto ());
+ this_type);
TREE_USED (this_decl) = 1;
DECL_ARTIFICIAL (this_decl) = 1;
DECL_ATTRIBUTES (this_decl)
int x;
constexpr explicit A (int v) : x(v) {}
constexpr A &operator ++ () { ++x; return *this; }
- constexpr int operator * () { return x; }
- constexpr bool operator != (const A &o) { return x != o.x; }
- constexpr A operator + (int o) { A r (x + o); return r; }
+ constexpr int operator * () const { return x; }
+ constexpr bool operator != (const A &o) const { return x != o.x; }
+ constexpr A operator + (int o) const { A r (x + o); return r; }
};
struct C
{
int x, y, z;
constexpr explicit C (int u, int v, int w) : x(u), y(v), z(w) {}
constexpr C &operator ++ () { ++x; --y; ++z; return *this; }
- constexpr C operator * () { return *this; }
- constexpr bool operator != (const C &o) { return x != o.x || y != o.y || z != o.z; }
- constexpr C operator + (int o) { C r (x + o, y - o, z + o); return r; }
+ constexpr C operator * () const { return *this; }
+ constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
+ constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
};
namespace N
int x;
constexpr explicit A (int v) : x(v) {}
constexpr A &operator ++ () { ++x; return *this; }
- constexpr int operator * () { return x; }
- constexpr bool operator != (const A &o) { return x != o.x; }
- constexpr A operator + (int o) { A r (x + o); return r; }
+ constexpr int operator * () const { return x; }
+ constexpr bool operator != (const A &o) const { return x != o.x; }
+ constexpr A operator + (int o) const { A r (x + o); return r; }
};
namespace N
int x;
constexpr explicit A (int v) : x(v) {}
constexpr A &operator ++ () { ++x; return *this; }
- constexpr int operator * () { return x; }
- constexpr bool operator != (const A &o) { return x != o.x; }
- constexpr A operator + (int o) { A r (x + o); return r; }
+ constexpr int operator * () const { return x; }
+ constexpr bool operator != (const A &o) const { return x != o.x; }
+ constexpr A operator + (int o) const { A r (x + o); return r; }
};
struct C
{
int x, y, z;
constexpr explicit C (int u, int v, int w) : x(u), y(v), z(w) {}
constexpr C &operator ++ () { ++x; --y; ++z; return *this; }
- constexpr C operator * () { return *this; }
- constexpr bool operator != (const C &o) { return x != o.x || y != o.y || z != o.z; }
- constexpr C operator + (int o) { C r (x + o, y - o, z + o); return r; }
+ constexpr C operator * () const { return *this; }
+ constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
+ constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
};
namespace N
int x;
constexpr explicit A (int v) : x(v) {}
constexpr A &operator ++ () { ++x; return *this; }
- constexpr int operator * () { return x; }
- constexpr bool operator != (const A &o) { return x != o.x; }
- constexpr A operator + (int o) { A r (x + o); return r; }
+ constexpr int operator * () const { return x; }
+ constexpr bool operator != (const A &o) const { return x != o.x; }
+ constexpr A operator + (int o) const { A r (x + o); return r; }
};
struct C
{
int x, y, z;
constexpr explicit C (int u, int v, int w) : x(u), y(v), z(w) {}
constexpr C &operator ++ () { ++x; --y; ++z; return *this; }
- constexpr C operator * () { return *this; }
- constexpr bool operator != (const C &o) { return x != o.x || y != o.y || z != o.z; }
- constexpr C operator + (int o) { C r (x + o, y - o, z + o); return r; }
+ constexpr C operator * () const { return *this; }
+ constexpr bool operator != (const C &o) const { return x != o.x || y != o.y || z != o.z; }
+ constexpr C operator + (int o) const { C r (x + o, y - o, z + o); return r; }
};
namespace N