re PR c++/54903 (Auto + static in-class constant initialization not working)

PR c++/54903
	* decl2.c (mark_used): Don't complain about auto in templates.

From-SVN: r193535
This commit is contained in:
Jason Merrill 2012-11-15 11:11:56 -05:00 committed by Jason Merrill
parent f64bcb29f5
commit c8d15a7262
3 changed files with 31 additions and 10 deletions

View File

@ -1,5 +1,8 @@
2012-11-14 Jason Merrill <jason@redhat.com>
PR c++/54903
* decl2.c (mark_used): Don't complain about auto in templates.
PR c++/37276
* decl.c (decls_match): Remove #ifdef around earlier fix.

View File

@ -4534,8 +4534,8 @@ mark_used (tree decl)
it to find out its type. */
if ((decl_maybe_constant_var_p (decl)
|| (TREE_CODE (decl) == FUNCTION_DECL
&& (DECL_DECLARED_CONSTEXPR_P (decl)
|| type_uses_auto (TREE_TYPE (TREE_TYPE (decl))))))
&& DECL_DECLARED_CONSTEXPR_P (decl))
|| type_uses_auto (TREE_TYPE (decl)))
&& DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INFO (decl)
&& !uses_template_parms (DECL_TI_ARGS (decl)))
@ -4550,6 +4550,14 @@ mark_used (tree decl)
--function_depth;
}
if (processing_template_decl)
return true;
/* Check this too in case we're within fold_non_dependent_expr. */
if (DECL_TEMPLATE_INFO (decl)
&& uses_template_parms (DECL_TI_ARGS (decl)))
return true;
if (type_uses_auto (TREE_TYPE (decl)))
{
error ("use of %qD before deduction of %<auto%>", decl);
@ -4560,14 +4568,6 @@ mark_used (tree decl)
if (cp_unevaluated_operand != 0)
return true;
if (processing_template_decl)
return true;
/* Check this too in case we're within fold_non_dependent_expr. */
if (DECL_TEMPLATE_INFO (decl)
&& uses_template_parms (DECL_TI_ARGS (decl)))
return true;
DECL_ODR_USED (decl) = 1;
if (DECL_CLONED_FUNCTION_P (decl))
DECL_ODR_USED (DECL_CLONED_FUNCTION (decl)) = 1;

View File

@ -0,0 +1,18 @@
// PR c++/54903
// { dg-options -std=c++11 }
template<int N, int D>
struct Modulus
{
static auto const value = N % D;
};
template<int N>
struct Angle
{
static auto const value = Modulus<N, 360>::value; // ERROR
//static int const value = Modulus<N, 360>::value; // OK
//static auto const value = N % 360; // OK
typedef Angle<value> type;
};