1 // { dg-do compile { target c++11 } } 2 3 template<typename _Tp, _Tp v> 4 struct A3 5 { 6 typedef _Tp value_type; 7 typedef A3<value_type,v> type; 8 9 static constexpr value_type value = v; 10 value_typeA311 constexpr operator value_type() { return value; } 12 }; 13 14 // Partial specialization. 15 template<typename _Tp, _Tp* v> 16 struct A3<_Tp*, v> 17 { 18 typedef _Tp* value_type; 19 typedef A3<value_type,v> type; 20 21 static constexpr value_type value = v; 22 23 constexpr operator value_type() { return value; } 24 }; 25 26 // Explicit specialization. 27 template<> 28 struct A3<unsigned short, 0> 29 { 30 typedef unsigned short value_type; 31 typedef A3<value_type, 0> type; 32 33 static constexpr value_type value = 0; 34 35 constexpr operator value_type() { return value; } 36 }; 37 38 // Explicitly instantiate. 39 template struct A3<int, 415>; 40 41 // Extern explicitly instantiate. 42 extern template struct A3<int, 510>; 43 44 // Use. 45 A3<int, 1111> a31; 46 A3<char, 9999> a32; // { dg-error "narrowing conversion" } 47