xref: /llvm-project/clang/test/CoverageMapping/macro-stringize-twice.cpp (revision 9caa3fbe03f43e3eec30262fbba87c1ee15c05a3)
1*9caa3fbeSZequan Wu // RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -triple %itanium_abi_triple -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s | FileCheck %s
2c0e275dfSReid Kleckner 
3c0e275dfSReid Kleckner // PR39942
4c0e275dfSReid Kleckner 
5c0e275dfSReid Kleckner class a;
6c0e275dfSReid Kleckner template <class b> a &operator<<(b &, const char *);
7c0e275dfSReid Kleckner int c;
8c0e275dfSReid Kleckner #define d(l) l(__FILE__, __LINE__, c)
9c0e275dfSReid Kleckner #define COMPACT_GOOGLE_LOG_ERROR d(e)
10c0e275dfSReid Kleckner #define f(g, cond) cond ? (void)0 : h() & g
11c0e275dfSReid Kleckner #define i(j) COMPACT_GOOGLE_LOG_##j.g()
12c0e275dfSReid Kleckner #define k(j) f(i(j), 0)
13c0e275dfSReid Kleckner class e {
14c0e275dfSReid Kleckner public:
15c0e275dfSReid Kleckner   e(const char *, int, int);
16c0e275dfSReid Kleckner   a &g();
17c0e275dfSReid Kleckner };
18c0e275dfSReid Kleckner class h {
19c0e275dfSReid Kleckner public:
20c0e275dfSReid Kleckner   void operator&(a &);
21c0e275dfSReid Kleckner };
22c0e275dfSReid Kleckner void use_str(const char *);
23c0e275dfSReid Kleckner 
24c0e275dfSReid Kleckner #define m(func)                                                                \
25c0e275dfSReid Kleckner   use_str(#func);                                                              \
26c0e275dfSReid Kleckner   k(ERROR) << #func;                                                           \
27c0e275dfSReid Kleckner   return 0; // CHECK: File 1, [[@LINE-1]]:4 -> [[@LINE-1]]:16 = (#0 - #1)
main()28c0e275dfSReid Kleckner int main() {
29c0e275dfSReid Kleckner   m(asdf);
30c0e275dfSReid Kleckner }
31