PR c++/80840 - ICE with constexpr and reference
authorJason Merrill <jason@redhat.com>
Wed, 31 May 2017 17:11:17 +0000 (13:11 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 31 May 2017 17:11:17 +0000 (13:11 -0400)
* pt.c (convert_nontype_argument): Don't test whether a decl is
value-dependent when binding to a reference.

From-SVN: r248749

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/ref10.C [new file with mode: 0644]

index 72a56f7..bbb6a53 100644 (file)
@@ -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.
index 8f69939..a04f2e0 100644 (file)
@@ -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 (file)
index 0000000..60e91d0
--- /dev/null
@@ -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() {}