1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <typeinfo> #include <string> #include <cxxabi.h> using namespace std; string demangle(const char* mangledName) { int status; char* result = abi::__cxa_demangle(mangledName, NULL, NULL, &status); switch(status) { case -1: cerr << "Out of memory!" << endl; exit(1); case -2: return mangledName; case -3: // Should never happen, but just in case? return mangledName; } string name = result; free(result); return name; } template<typename T> struct preserve_qualifiers {}; template<typename T> class typeinfo { typedef preserve_qualifiers<T> wrap; public: static const string name() { string name = demangle(typeid(wrap).name()); int i = name.find_first_of('<'); if(i == string::npos) return name; int j = name.length() - i - 2; return name.substr(i + 1, j); } }; #define TypeOut(...) cout \ << "Type " #__VA_ARGS__ ": " << endl \ << " Mangled: " << typeid(__VA_ARGS__).name() << endl \ << " Demangled: " << demangle(typeid(__VA_ARGS__).name()) << endl \ << " typeinfo<>: " << typeinfo<__VA_ARGS__>::name() << endl class A {}; template<typename T> class F {}; template<int T> class G {}; template<template<typename> class T> class H {}; template<template<int> class T> class I {}; template<typename... T> class J {}; template<int... T> class K {}; template<template<typename> class... T> class L {}; template<template<int> class... T> class M {}; template<template<typename> class... T> class N {}; template<template<template<typename> class...> class... T> class O {}; struct bits {int i : 4, j : 2;}; template<typename T, int n> struct bits2 {T val : n;}; int main(int argc, char* argv[]) { TypeOut(void(*volatile)(void(*const)())); TypeOut(int (A::*)()); TypeOut(int (A::*)()const); TypeOut(int (A::*const)()); TypeOut(F<int>); TypeOut(G<3>); TypeOut(H<F>); TypeOut(I<G>); TypeOut(J<int>); TypeOut(K<3>); TypeOut(L<F>); TypeOut(M<G>); TypeOut(N<F,F,F>); TypeOut(O<N,N>); } |
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3h4YWJpLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIGRlbWFuZ2xlKGNvbnN0IGNoYXIqIG1hbmdsZWROYW1lKSB7CglpbnQgc3RhdHVzOwoJY2hhciogcmVzdWx0ID0gYWJpOjpfX2N4YV9kZW1hbmdsZShtYW5nbGVkTmFtZSwgTlVMTCwgTlVMTCwgJnN0YXR1cyk7Cglzd2l0Y2goc3RhdHVzKSB7CgljYXNlIC0xOgoJCWNlcnIgPDwgIk91dCBvZiBtZW1vcnkhIiA8PCBlbmRsOwoJCWV4aXQoMSk7CgljYXNlIC0yOgoJCXJldHVybiBtYW5nbGVkTmFtZTsKCWNhc2UgLTM6IC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBqdXN0IGluIGNhc2U/CgkJcmV0dXJuIG1hbmdsZWROYW1lOwoJfQoJc3RyaW5nIG5hbWUgPSByZXN1bHQ7CglmcmVlKHJlc3VsdCk7CglyZXR1cm4gbmFtZTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHByZXNlcnZlX3F1YWxpZmllcnMge307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB0eXBlaW5mbyB7Cgl0eXBlZGVmIHByZXNlcnZlX3F1YWxpZmllcnM8VD4gd3JhcDsKcHVibGljOgoJc3RhdGljIGNvbnN0IHN0cmluZyBuYW1lKCkgewoJCXN0cmluZyBuYW1lID0gZGVtYW5nbGUodHlwZWlkKHdyYXApLm5hbWUoKSk7CgkJaW50IGkgPSBuYW1lLmZpbmRfZmlyc3Rfb2YoJzwnKTsKCQlpZihpID09IHN0cmluZzo6bnBvcykgcmV0dXJuIG5hbWU7CgkJaW50IGogPSBuYW1lLmxlbmd0aCgpIC0gaSAtIDI7CgkJcmV0dXJuIG5hbWUuc3Vic3RyKGkgKyAxLCBqKTsKCX0KfTsKCiNkZWZpbmUgVHlwZU91dCguLi4pIGNvdXQgXAoJPDwgIlR5cGUgIiAjX19WQV9BUkdTX18gIjogIiA8PCBlbmRsIFwKCTw8ICIgIE1hbmdsZWQ6ICIgPDwgdHlwZWlkKF9fVkFfQVJHU19fKS5uYW1lKCkgPDwgZW5kbCBcCgk8PCAiICBEZW1hbmdsZWQ6ICIgPDwgZGVtYW5nbGUodHlwZWlkKF9fVkFfQVJHU19fKS5uYW1lKCkpIDw8IGVuZGwgXAoJPDwgIiAgdHlwZWluZm88PjogIiA8PCB0eXBlaW5mbzxfX1ZBX0FSR1NfXz46Om5hbWUoKSA8PCBlbmRsCmNsYXNzIEEge307CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEYge307CnRlbXBsYXRlPGludCBUPiBjbGFzcyBHIHt9Owp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgVD4gY2xhc3MgSCB7fTsKdGVtcGxhdGU8dGVtcGxhdGU8aW50PiBjbGFzcyBUPiBjbGFzcyBJIHt9Owp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBjbGFzcyBKIHt9Owp0ZW1wbGF0ZTxpbnQuLi4gVD4gY2xhc3MgSyB7fTsKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzLi4uIFQ+IGNsYXNzIEwge307CnRlbXBsYXRlPHRlbXBsYXRlPGludD4gY2xhc3MuLi4gVD4gY2xhc3MgTSB7fTsKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzLi4uIFQ+IGNsYXNzIE4ge307CnRlbXBsYXRlPHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcy4uLj4gY2xhc3MuLi4gVD4gY2xhc3MgTyB7fTsKc3RydWN0IGJpdHMge2ludCBpIDogNCwgaiA6IDI7fTsKdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4+IHN0cnVjdCBiaXRzMiB7VCB2YWwgOiBuO307CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CglUeXBlT3V0KHZvaWQoKnZvbGF0aWxlKSh2b2lkKCpjb25zdCkoKSkpOwoJVHlwZU91dChpbnQgKEE6OiopKCkpOwoJVHlwZU91dChpbnQgKEE6OiopKCljb25zdCk7CglUeXBlT3V0KGludCAoQTo6KmNvbnN0KSgpKTsKCVR5cGVPdXQoRjxpbnQ+KTsKCVR5cGVPdXQoRzwzPik7CglUeXBlT3V0KEg8Rj4pOwoJVHlwZU91dChJPEc+KTsKCVR5cGVPdXQoSjxpbnQ+KTsKCVR5cGVPdXQoSzwzPik7CglUeXBlT3V0KEw8Rj4pOwoJVHlwZU91dChNPEc+KTsKCVR5cGVPdXQoTjxGLEYsRj4pOwoJVHlwZU91dChPPE4sTj4pOwp9
-
upload with new input
-
result: Success time: 0s memory: 3072 kB returned value: 0
Type void(*volatile)(void(*const)()): Mangled: PFvPFvvEE Demangled: void (*)(void (*)()) typeinfo<>: void (* volatile)(void (*)()) Type int (A::*)(): Mangled: M1AFivE Demangled: int (A::*)() typeinfo<>: int (A::*)() Type int (A::*)()const: Mangled: M1AKFivE Demangled: int (A::*)() const typeinfo<>: int (A::*)() const Type int (A::*const)(): Mangled: M1AFivE Demangled: int (A::*)() typeinfo<>: int (A::* const)() Type F<int>: Mangled: 1FIiE Demangled: F<int> typeinfo<>: F<int> Type G<3>: Mangled: 1GILi3EE Demangled: G<3> typeinfo<>: G<3> Type H<F>: Mangled: 1HI1FE Demangled: H<F> typeinfo<>: H<F> Type I<G>: Mangled: 1II1GE Demangled: I<G> typeinfo<>: I<G> Type J<int>: Mangled: 1JIIiEE Demangled: J<int> typeinfo<>: J<int> Type K<3>: Mangled: 1KIILi3EEE Demangled: K<3> typeinfo<>: K<3> Type L<F>: Mangled: 1LII1FEE Demangled: L<F> typeinfo<>: L<F> Type M<G>: Mangled: 1MII1GEE Demangled: M<G> typeinfo<>: M<G> Type N<F,F,F>: Mangled: 1NII1FS0_S0_EE Demangled: N<F, F, F> typeinfo<>: N<F, F, F> Type O<N,N>: Mangled: 1OII1NS0_EE Demangled: O<N, N> typeinfo<>: O<N, N>


