mirror of git://gcc.gnu.org/git/gcc.git
PR c++/80840 - ICE with constexpr and reference
* pt.c (convert_nontype_argument): Don't test whether a decl is value-dependent when binding to a reference. From-SVN: r248749
This commit is contained in:
parent
91e920c939
commit
049a5d31b9
|
|
@ -1,3 +1,9 @@
|
||||||
|
2017-05-31 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/80840 - ICE with constexpr and reference
|
||||||
|
* pt.c (convert_nontype_argument): Don't test whether a decl is
|
||||||
|
value-dependent when binding to a reference.
|
||||||
|
|
||||||
2017-05-31 Nathan Sidwell <nathan@acm.org>
|
2017-05-31 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
* cp-tree.h (lang_decl_slector): New enum.
|
* cp-tree.h (lang_decl_slector): New enum.
|
||||||
|
|
|
||||||
11
gcc/cp/pt.c
11
gcc/cp/pt.c
|
|
@ -6749,7 +6749,11 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!value_dependent_expression_p (expr))
|
if (TYPE_REF_OBJ_P (TREE_TYPE (expr))
|
||||||
|
&& value_dependent_expression_p (expr))
|
||||||
|
/* OK, dependent reference. We don't want to ask whether a DECL is
|
||||||
|
itself value-dependent, since what we want here is its address. */;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (!DECL_P (expr))
|
if (!DECL_P (expr))
|
||||||
{
|
{
|
||||||
|
|
@ -6771,8 +6775,11 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
expr = build_nop (type, build_address (expr));
|
expr = build_address (expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!same_type_p (type, TREE_TYPE (expr)))
|
||||||
|
expr = build_nop (type, expr);
|
||||||
}
|
}
|
||||||
/* [temp.arg.nontype]/5, bullet 4
|
/* [temp.arg.nontype]/5, bullet 4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
// PR c++/80840
|
||||||
|
// { dg-do compile { target c++11 } }
|
||||||
|
|
||||||
|
template <class T, T X>
|
||||||
|
struct Just;
|
||||||
|
|
||||||
|
template <const double& X>
|
||||||
|
struct Number {
|
||||||
|
static constexpr double value = X;
|
||||||
|
using result = Just<const double&, value>;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {}
|
||||||
Loading…
Reference in New Issue