#include <type_traits>
struct A { } ;
struct B : A { } ;
struct C;
template < typename T>
struct Template { } ;
template < typename T>
void foo( const Template< T* > & tc) {
static_assert( std:: is_convertible < T* , A* > :: value , "Template argument must be convertible to A*" ) ;
}
int main( ) {
Template< A* > a;
Template< B* > b;
Template< C* > c;
foo( a) ;
foo( b) ;
foo( c) ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKc3RydWN0IEEge307CnN0cnVjdCBCIDogQSB7fTsKc3RydWN0IEM7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IFRlbXBsYXRlIHt9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGZvbyhjb25zdCBUZW1wbGF0ZTxUKj4mIHRjKSB7CglzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29udmVydGlibGU8VCosIEEqPjo6dmFsdWUsICJUZW1wbGF0ZSBhcmd1bWVudCBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIEEqIik7Cn0KCmludCBtYWluKCkgewoJVGVtcGxhdGU8QSo+IGE7CglUZW1wbGF0ZTxCKj4gYjsKCVRlbXBsYXRlPEMqPiBjOwoJCglmb28oYSk7Cglmb28oYik7Cglmb28oYyk7Cn0K