aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-05-31 13:11:17 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-05-31 13:11:17 -0400
commit049a5d31b9fce6c40721e8c07573c34df9ed9eec (patch)
tree8f309764aa69498447ce8d6c5433923406581bac
parent91e920c9390f5293fdc84fbf9859dab53d7454b0 (diff)
downloadgcc-049a5d31b9fce6c40721e8c07573c34df9ed9eec.zip
gcc-049a5d31b9fce6c40721e8c07573c34df9ed9eec.tar.gz
gcc-049a5d31b9fce6c40721e8c07573c34df9ed9eec.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/g++.dg/template/ref10.C13
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 72a56f7..bbb6a53 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>
* cp-tree.h (lang_decl_slector): New enum.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 8f69939..a04f2e0 100644
--- a/gcc/cp/pt.c
+++ b/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))
{
@@ -6771,8 +6775,11 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
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
diff --git a/gcc/testsuite/g++.dg/template/ref10.C b/gcc/testsuite/g++.dg/template/ref10.C
new file mode 100644
index 0000000..60e91d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ref10.C
@@ -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() {}