// { dg-do compile } // Copyright (C) 2001 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 24 Jun 2004 // Origin Rani Sharoni via giovannibajo@libero.it // Bug 16174, SFINAE failure. template struct K { K(); K(K & rhs); K(K const& rhs); template K(K const& rhs); private: template struct A; template struct A< K const> { typedef typename K::compile_time_error type; }; // This is used to reject calls to the copy constructor // with objects which are top-level const. If they are // const, the specialization of A is instantiated and // causes a compile time error. Otherwise, the general // template is picked up, it misses definition, so this // ctor declaration is rejected by SFINAE and everybody // is happy. // GCC 3.4.1pre and 3.5.0 always matches A's specialization // when instantiating from foo(), and this causes the error. template K(U& rhs, typename A::type = 0); }; K foo(void) { return K(); }