1*67e74705SXin Li // RUN: %clang_cc1 %s -verify -Wconversion 2*67e74705SXin Li 3*67e74705SXin Li // Don't crash (rdar://11168596) 4*67e74705SXin Li #define A(desc) _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wparentheses\"") _Pragma("clang diagnostic pop") 5*67e74705SXin Li #define B(desc) A(desc) 6*67e74705SXin Li B(_Pragma("clang diagnostic ignored \"-Wparentheses\"")) 7*67e74705SXin Li 8*67e74705SXin Li 9*67e74705SXin Li #define EMPTY(x) 10*67e74705SXin Li #define INACTIVE(x) EMPTY(x) 11*67e74705SXin Li 12*67e74705SXin Li #define ID(x) x 13*67e74705SXin Li #define ACTIVE(x) ID(x) 14*67e74705SXin Li 15*67e74705SXin Li // This should be ignored.. 16*67e74705SXin Li INACTIVE(_Pragma("clang diagnostic ignored \"-Wconversion\"")) 17*67e74705SXin Li 18*67e74705SXin Li #define IGNORE_CONV _Pragma("clang diagnostic ignored \"-Wconversion\"") _Pragma("clang diagnostic ignored \"-Wconversion\"") 19*67e74705SXin Li 20*67e74705SXin Li // ..as should this. 21*67e74705SXin Li INACTIVE(IGNORE_CONV) 22*67e74705SXin Li 23*67e74705SXin Li #define IGNORE_POPPUSH(Pop, Push, W, D) Push W D Pop 24*67e74705SXin Li IGNORE_POPPUSH(_Pragma("clang diagnostic pop"), _Pragma("clang diagnostic push"), 25*67e74705SXin Li _Pragma("clang diagnostic ignored \"-Wconversion\""), int q = (double)1.0); 26*67e74705SXin Li 27*67e74705SXin Li int x1 = (double)1.0; // expected-warning {{implicit conversion}} 28*67e74705SXin Li 29*67e74705SXin Li ACTIVE(_Pragma) ("clang diagnostic ignored \"-Wconversion\"")) // expected-error {{_Pragma takes a parenthesized string literal}} \ 30*67e74705SXin Li expected-error {{expected identifier or '('}} expected-error {{expected ')'}} expected-note {{to match this '('}} 31*67e74705SXin Li 32*67e74705SXin Li // This should disable the warning. 33*67e74705SXin Li ACTIVE(IGNORE_CONV) 34*67e74705SXin Li 35*67e74705SXin Li int x2 = (double)1.0; 36