// PR c++/14337 template <bool> struct Constraint; template <> struct Constraint<true> { typedef int Result; }; template <typename T> struct IsInt { static const bool value = false; }; template <> struct IsInt<int> { static const bool value = true; }; template <typename T> typename Constraint<IsInt<T>::value>::Result foo(T); template <typename T> typename Constraint<!IsInt<T>::value>::Result foo(T); template <typename> void bar() { foo(1); }