@@ -4027,6 +4027,14 @@ maybe_constant_value (tree t, tree decl)
return ret;
}
+/* Dispose of the whole CV_CACHE. */
+
+void
+clear_cv_cache (void)
+{
+ gt_cleare_cache (cv_cache);
+}
+
/* Like maybe_constant_value but first fully instantiate the argument.
Note: this is equivalent to instantiate_non_dependent_expr_sfinae
@@ -6919,6 +6919,7 @@ extern bool var_in_constexpr_fn (tree);
extern void explain_invalid_constexpr_fn (tree);
extern vec<tree> cx_error_context (void);
extern tree fold_sizeof_expr (tree);
+extern void clear_cv_cache (void);
/* In c-family/cilk.c */
extern bool cilk_valid_spawn (tree);
@@ -13386,6 +13386,10 @@ finish_enum_value_list (tree enumtype)
/* Finish debugging output for this type. */
rest_of_type_compilation (enumtype, namespace_bindings_p ());
+
+ /* Each enumerator now has the type of its enumeration. Clear the cache
+ so that this change in types doesn't confuse us later on. */
+ clear_cv_cache ();
}
/* Finishes the enum type. This is called only the first time an
@@ -0,0 +1,14 @@
+// PR c++/68586
+// { dg-do compile { target c++11 } }
+
+enum E { x , y = 1 + (x << 1) };
+template<E> struct A {};
+A<x> a;
+
+enum E2 : int { x2 , y2 = x2 << 1 };
+template<E2> struct A2 {};
+A2<x2> a2;
+
+enum class E3 { x3 , y3 = x3 << 1 };
+template<E3> struct A3 {};
+A3<E3::x3> a3;