1// PR c++/47950 2 3template <typename T> struct empty 4{ 5 // allow success case to build (not relevant to bug) 6 operator bool() { return true; } 7}; 8 9template <typename T> struct from_int 10{ 11 from_int(int) {} 12 13 // allow success case to build (not relevant to bug) 14 operator bool() { return true; } 15}; 16 17template <typename T> 18from_int<T> via_function(T v) 19{ 20 return from_int<T>(v); 21} 22 23template <typename T> 24void f() 25{ 26 // ********* this section compiles *********** 27 28 // these plain initializers work fine 29 from_int<int> a = 7; 30 from_int<int> b = from_int<int>(7); 31 empty<int> c = empty<int>(); 32 from_int<T> ta = 7; 33 from_int<T> tb = from_int<T>(7); 34 empty<T> tc = empty<T>(); 35 36 // these dependent condition decls work fine 37 if (empty<T> x = empty<T>()) 38 ; 39 if (from_int<T> x = 7) 40 ; 41 if (from_int<T> x = from_int<T>(7)) 42 ; 43 if (from_int<T> x = via_function(T())) 44 ; 45 46 // this non-dependent condition decl using conversion works fine 47 if (from_int<int> x = 7) 48 ; 49 50 // these non-dependent condition decls using conversion or braced- 51 // initialization work fine (in c++0x mode only course) 52 #if __GXX_EXPERIMENTAL_CXX0X__ 53 if (empty<int> x {}) 54 ; 55 if (from_int<int> x {7}) 56 ; 57 #endif 58 59 // ********** this section fails in C++0x *********** 60 61 // the following non-dependent condition decls cause an assertion 62 // failure in 63 // 64 // tsubst_copy_and_build, at cp/pt.c:13370 65 // 66 // in C++0x mode 67 // 68 if (empty<int> x = empty<int>()) 69 ; 70 if (from_int<int> x = from_int<int>(7)) 71 ; 72 if (from_int<int> x = via_function(7)) 73 ; 74} 75 76int main() 77{ 78 f<int>(); 79} 80