Commit 1e297006 by Marek Polacek Committed by Marek Polacek

re PR c++/68586 (Enum template parameter wrongly rejected)

	PR c++/68586
	* constexpr.c (clear_cv_cache): New.
	* cp-gimplify.c (clear_fold_cache): New.
	* cp-tree.h (clear_cv_cache, clear_fold_cache): Declare.
	* decl.c (finish_enum_value_list): Call them.

	* g++.dg/cpp0x/enum30.C: New test.

From-SVN: r232562
parent c8012fbc
2016-01-19 Marek Polacek <polacek@redhat.com>
PR c++/68586
* constexpr.c (clear_cv_cache): New.
* cp-gimplify.c (clear_fold_cache): New.
* cp-tree.h (clear_cv_cache, clear_fold_cache): Declare.
* decl.c (finish_enum_value_list): Call them.
2016-01-18 Patrick Palka <ppalka@gcc.gnu.org> 2016-01-18 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/11858 PR c++/11858
......
...@@ -4027,6 +4027,14 @@ maybe_constant_value (tree t, tree decl) ...@@ -4027,6 +4027,14 @@ maybe_constant_value (tree t, tree decl)
return ret; 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. /* Like maybe_constant_value but first fully instantiate the argument.
Note: this is equivalent to instantiate_non_dependent_expr_sfinae Note: this is equivalent to instantiate_non_dependent_expr_sfinae
......
...@@ -1896,6 +1896,14 @@ c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/) ...@@ -1896,6 +1896,14 @@ c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/)
static GTY((cache, deletable)) cache_map fold_cache; static GTY((cache, deletable)) cache_map fold_cache;
/* Dispose of the whole FOLD_CACHE. */
void
clear_fold_cache (void)
{
gt_cleare_cache (fold_cache);
}
/* This function tries to fold an expression X. /* This function tries to fold an expression X.
To avoid combinatorial explosion, folding results are kept in fold_cache. To avoid combinatorial explosion, folding results are kept in fold_cache.
If we are processing a template or X is invalid, we don't fold at all. If we are processing a template or X is invalid, we don't fold at all.
......
...@@ -6819,6 +6819,7 @@ extern bool cxx_omp_privatize_by_reference (const_tree); ...@@ -6819,6 +6819,7 @@ extern bool cxx_omp_privatize_by_reference (const_tree);
extern bool cxx_omp_disregard_value_expr (tree, bool); extern bool cxx_omp_disregard_value_expr (tree, bool);
extern void cp_fold_function (tree); extern void cp_fold_function (tree);
extern tree cp_fully_fold (tree); extern tree cp_fully_fold (tree);
extern void clear_fold_cache (void);
/* in name-lookup.c */ /* in name-lookup.c */
extern void suggest_alternatives_for (location_t, tree); extern void suggest_alternatives_for (location_t, tree);
...@@ -6919,6 +6920,7 @@ extern bool var_in_constexpr_fn (tree); ...@@ -6919,6 +6920,7 @@ extern bool var_in_constexpr_fn (tree);
extern void explain_invalid_constexpr_fn (tree); extern void explain_invalid_constexpr_fn (tree);
extern vec<tree> cx_error_context (void); extern vec<tree> cx_error_context (void);
extern tree fold_sizeof_expr (tree); extern tree fold_sizeof_expr (tree);
extern void clear_cv_cache (void);
/* In c-family/cilk.c */ /* In c-family/cilk.c */
extern bool cilk_valid_spawn (tree); extern bool cilk_valid_spawn (tree);
......
...@@ -13392,6 +13392,11 @@ finish_enum_value_list (tree enumtype) ...@@ -13392,6 +13392,11 @@ finish_enum_value_list (tree enumtype)
/* Finish debugging output for this type. */ /* Finish debugging output for this type. */
rest_of_type_compilation (enumtype, namespace_bindings_p ()); 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 ();
clear_fold_cache ();
} }
/* Finishes the enum type. This is called only the first time an /* Finishes the enum type. This is called only the first time an
......
2016-01-19 Marek Polacek <polacek@redhat.com>
PR c++/68586
* g++.dg/cpp0x/enum30.C: New test.
2016-01-19 Richard Biener <rguenther@suse.de> 2016-01-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/69336 PR tree-optimization/69336
......
// 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment