Index: gcc/testsuite/g++.dg/lookup/using50.C
===================================================================
--- gcc/testsuite/g++.dg/lookup/using50.C	(revision 0)
+++ gcc/testsuite/g++.dg/lookup/using50.C	(revision 0)
@@ -0,0 +1,15 @@
+// PR c++/51319
+// { dg-do compile }
+
+template<int> struct X {};
+
+struct Base 
+{
+    enum { a = 1 };
+};
+
+struct Der : Base 
+{
+    using Base::a;
+    typedef X<(int)a> Y;
+};
Index: gcc/testsuite/g++.dg/lookup/using51.C
===================================================================
--- gcc/testsuite/g++.dg/lookup/using51.C	(revision 0)
+++ gcc/testsuite/g++.dg/lookup/using51.C	(revision 0)
@@ -0,0 +1,17 @@
+// PR c++/51382
+// { dg-do compile }
+
+template< int Value >
+struct Base
+{
+   enum { b_e = Value };
+};
+
+template< typename Type >
+struct Derived : Type
+{
+   Type::b_e;
+   enum { d_e = b_e };
+};
+
+int v = (int)Derived< Base< 3 > >::d_e;
Index: gcc/cp/semantics.c
===================================================================
--- gcc/cp/semantics.c	(revision 181491)
+++ gcc/cp/semantics.c	(working copy)
@@ -2893,6 +2893,8 @@ finish_id_expression (tree id_expression
 		      const char **error_msg,
 		      location_t location)
 {
+  tree target_decl = NULL_TREE;
+
   /* Initialize the output parameters.  */
   *idk = CP_ID_KIND_NONE;
   *error_msg = NULL;
@@ -3067,15 +3069,16 @@ finish_id_expression (tree id_expression
     }
   /* Similarly, we resolve enumeration constants to their
      underlying values.  */
-  else if (TREE_CODE (decl) == CONST_DECL)
+  else if ((target_decl = strip_using_decl (decl))
+	   && TREE_CODE (target_decl) == CONST_DECL)
     {
       *idk = CP_ID_KIND_NONE;
       if (!processing_template_decl)
 	{
-	  used_types_insert (TREE_TYPE (decl));
-	  return DECL_INITIAL (decl);
+	  used_types_insert (TREE_TYPE (target_decl));
+	  return DECL_INITIAL (target_decl);
 	}
-      return decl;
+      return target_decl;
     }
   else
     {
