2017-01-04 Nathan Sidwell <nathan@acm.org>
cp/
PR c++/78765
* pt.c (convert_nontype_argument): Don't try and see if integral
or enum expressions are constants prematurely.
testsuite/
PR c++/78765
* g++.dg/cpp0x/pr78765.C: New.
===================================================================
@@ -6386,7 +6386,7 @@ convert_nontype_argument (tree type, tre
to leave it in that form rather than lower it to a
CONSTRUCTOR. */;
else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
- expr = maybe_constant_value (expr);
+ /* Constant value checking is done later with type conversion. */;
else if (cxx_dialect >= cxx1z)
{
if (TREE_CODE (type) != REFERENCE_TYPE)
===================================================================
@@ -0,0 +1,15 @@
+// PR c++/78765
+// { dg-do compile { target c++11 } }
+
+// ICE with failed constexpr object and member fn call
+
+struct ValueType {
+ constexpr operator int() const {return field;}
+ int field;
+};
+
+static constexpr ValueType var = 0; // { dg-error "conversion" }
+
+template <int> class ValueTypeInfo;
+
+ValueTypeInfo<var> x;