dblaikie added a comment. In D90714#2377231 <https://reviews.llvm.org/D90714#2377231>, @mibintc wrote:
> I'm sorry, I don't see how to build up an identifier with an arbitrary number > of characters using the token pasting, for example an ident with 4095 > characters is not a power of 2. I tried pasting together X2048 X1024 X512 etc > but that doesn't work > > fu.cpp:12:18: error: pasting ")" and "X16" does not give a valid > preprocessing token > #define FUN X32(x) ## X16(x) > ^ > fu.cpp:13:1: note: in expansion of macro ‘FUN’ Ah, yeah, that's the awkward thing where you have to indirect macro expansions before concatenation (some discussion here <https://wiki.sei.cmu.edu/confluence/display/c/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification>, though couldn't find the perfect reference/discussion on the issue). Essentially you've got to add an extra level of macro indirection to be able to concatenate like that, eg: #define FUN_HELPER(x, y) x ## y #define FUN FUN_HELPER(X32(x), X16(x)) > I want the test case to show the transition between when md5 is not needed > and when it's needed, i want to build strings that might not be power of root > string. I could add more comments to the test case, perhaps, "the strlen of > the Microsoft mangled name is X" for the one case, and "the strlen of ... is > X+1" for the other. They're really non-obvious that those particular mangled names produce names that are exactly a certain length, even with a comment that seems pretty subtle compared to a more direct construction. Let's see how to build a 4095 length function name... bit more code, but I think fairly legible: https://godbolt.org/z/Tbv6zz #define STR_(X) #X #define STR(X) STR_(X) #define C_(P1, P2) P1##P2 #define C2(P1, P2) C_(P1, P2) #define C4(P1, P2, P3, P4) C2(C2(P1, P2), C2(P3, P4)) #define X2(X) C2(X, X) #define X4(X) X2(X2(X)) #define X8(X) X2(X4(X)) #define X16(X) X2(X8(X)) #define X32(X) X2(X16(X)) #define X64(X) X2(X32(X)) #define X128(X) X2(X64(X)) #define X256(X) X2(X128(X)) #define X512(X) X2(X256(X)) #define X1024(X) X2(X512(X)) #define X2048(X) X2(X1024(X)) #define X4096(X) X2(X2048(X)) #define X4095(X) \ C2(C2( \ C4(X, X2(X), X4(X), X8(X)), \ C4(X16(X), X32(X), X64(X), X128(X))), \ C4(X256(X), X512(X), X1024(X), X2048(X))) void X4096(a)() {} extern int a[4096]; int a[sizeof(STR(X4096(a))) - 1]; void X4095(b)() {} extern int b[4095]; int b[sizeof(STR(X4095(b))) - 1]; Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D90714/new/ https://reviews.llvm.org/D90714 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits