1*67e74705SXin Li // RUN: %clang_cc1 -x assembler-with-cpp -E %s -o - | FileCheck -strict-whitespace -check-prefix=CHECK-Identifiers-False %s 2*67e74705SXin Li 3*67e74705SXin Li #ifndef __ASSEMBLER__ 4*67e74705SXin Li #error "__ASSEMBLER__ not defined" 5*67e74705SXin Li #endif 6*67e74705SXin Li 7*67e74705SXin Li 8*67e74705SXin Li // Invalid token pasting is ok. 9*67e74705SXin Li #define A X ## . 10*67e74705SXin Li 1: A 11*67e74705SXin Li // CHECK-Identifiers-False: 1: X . 12*67e74705SXin Li 13*67e74705SXin Li // Line markers are not linemarkers in .S files, they are passed through. 14*67e74705SXin Li # 321 15*67e74705SXin Li // CHECK-Identifiers-False: # 321 16*67e74705SXin Li 17*67e74705SXin Li // Unknown directives are passed through. 18*67e74705SXin Li # B C 19*67e74705SXin Li // CHECK-Identifiers-False: # B C 20*67e74705SXin Li 21*67e74705SXin Li // Unknown directives are expanded. 22*67e74705SXin Li #define D(x) BAR ## x 23*67e74705SXin Li # D(42) 24*67e74705SXin Li // CHECK-Identifiers-False: # BAR42 25*67e74705SXin Li 26*67e74705SXin Li // Unmatched quotes are permitted. 27*67e74705SXin Li 2: ' 28*67e74705SXin Li 3: " 29*67e74705SXin Li // CHECK-Identifiers-False: 2: ' 30*67e74705SXin Li // CHECK-Identifiers-False: 3: " 31*67e74705SXin Li 32*67e74705SXin Li // (balance quotes to keep editors happy): "' 33*67e74705SXin Li 34*67e74705SXin Li // Empty char literals are ok. 35*67e74705SXin Li 4: '' 36*67e74705SXin Li // CHECK-Identifiers-False: 4: '' 37*67e74705SXin Li 38*67e74705SXin Li 39*67e74705SXin Li // Portions of invalid pasting should still expand as macros. 40*67e74705SXin Li // rdar://6709206 41*67e74705SXin Li #define M4 expanded 42*67e74705SXin Li #define M5() M4 ## ( 43*67e74705SXin Li 44*67e74705SXin Li 5: M5() 45*67e74705SXin Li // CHECK-Identifiers-False: 5: expanded ( 46*67e74705SXin Li 47*67e74705SXin Li // rdar://6804322 48*67e74705SXin Li #define FOO(name) name ## $foo 49*67e74705SXin Li 6: FOO(blarg) 50*67e74705SXin Li // CHECK-Identifiers-False: 6: blarg $foo 51*67e74705SXin Li 52*67e74705SXin Li // RUN: %clang_cc1 -x assembler-with-cpp -fdollars-in-identifiers -E %s -o - | FileCheck -check-prefix=CHECK-Identifiers-True -strict-whitespace %s 53*67e74705SXin Li #define FOO(name) name ## $foo 54*67e74705SXin Li 7: FOO(blarg) 55*67e74705SXin Li // CHECK-Identifiers-True: 7: blarg$foo 56*67e74705SXin Li 57*67e74705SXin Li // 58*67e74705SXin Li #define T6() T6 #nostring 59*67e74705SXin Li #define T7(x) T7 #x 60*67e74705SXin Li 8: T6() 61*67e74705SXin Li 9: T7(foo) 62*67e74705SXin Li // CHECK-Identifiers-True: 8: T6 #nostring 63*67e74705SXin Li // CHECK-Identifiers-True: 9: T7 "foo" 64*67e74705SXin Li 65*67e74705SXin Li // Concatenation with period doesn't leave a space 66*67e74705SXin Li #define T8(A,B) A ## B 67*67e74705SXin Li 10: T8(.,T8) 68*67e74705SXin Li // CHECK-Identifiers-True: 10: .T8 69*67e74705SXin Li 70*67e74705SXin Li // This should not crash. 71*67e74705SXin Li #define T11(a) #0 72*67e74705SXin Li 11: T11(b) 73*67e74705SXin Li // CHECK-Identifiers-True: 11: #0 74*67e74705SXin Li 75*67e74705SXin Li // Universal character names can specify basic ascii and control characters 76*67e74705SXin Li 12: \u0020\u0030\u0080\u0000 77*67e74705SXin Li // CHECK-Identifiers-False: 12: \u0020\u0030\u0080\u0000 78*67e74705SXin Li 79*67e74705SXin Li // This should not crash 80*67e74705SXin Li // rdar://8823139 81*67e74705SXin Li # ## 82*67e74705SXin Li // CHECK-Identifiers-False: # ## 83*67e74705SXin Li 84*67e74705SXin Li #define X(a) # # # 1 85*67e74705SXin Li X(1) 86*67e74705SXin Li // CHECK-Identifiers-False: # # # 1 87