// RUN: %clang_cc1 %s -verify -Wconversion // Don't crash (rdar://11168596) #define A(desc) _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wparentheses\"") _Pragma("clang diagnostic pop") #define B(desc) A(desc) B(_Pragma("clang diagnostic ignored \"-Wparentheses\"")) #define EMPTY(x) #define INACTIVE(x) EMPTY(x) #define ID(x) x #define ACTIVE(x) ID(x) // This should be ignored.. INACTIVE(_Pragma("clang diagnostic ignored \"-Wconversion\"")) #define IGNORE_CONV _Pragma("clang diagnostic ignored \"-Wconversion\"") _Pragma("clang diagnostic ignored \"-Wconversion\"") // ..as should this. INACTIVE(IGNORE_CONV) #define IGNORE_POPPUSH(Pop, Push, W, D) Push W D Pop IGNORE_POPPUSH(_Pragma("clang diagnostic pop"), _Pragma("clang diagnostic push"), _Pragma("clang diagnostic ignored \"-Wconversion\""), int q = (double)1.0); int x1 = (double)1.0; // expected-warning {{implicit conversion}} ACTIVE(_Pragma) ("clang diagnostic ignored \"-Wconversion\"")) // expected-error {{_Pragma takes a parenthesized string literal}} \ expected-error {{expected identifier or '('}} expected-error {{expected ')'}} expected-note {{to match this '('}} // This should disable the warning. ACTIVE(IGNORE_CONV) int x2 = (double)1.0;