diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dc510ab472870687fcbe9bd22c756a6f2a120a2d..232822a59083ea55fd7f83178214fca0d78f7a85 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 90ee16bde969619994a78ce58f841303331742a8..9f20757c30f3a0fe491ae3efea611e62e99fecec 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto36.C b/gcc/testsuite/g++.dg/cpp0x/auto36.C new file mode 100644 index 0000000000000000000000000000000000000000..c3530401bd281cc7b0ca6cfb88e46722e3e93c25 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto36.C @@ -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; +};