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;
+};