Home | History | Annotate | Download | only in Preprocessor
      1 // Test the __VA_ARGS__ comma swallowing extensions of various compiler dialects.
      2 
      3 // RUN: %clang_cc1 -E %s | FileCheck -check-prefix=GCC -strict-whitespace %s
      4 // RUN: %clang_cc1 -E -std=c99 %s | FileCheck -check-prefix=C99 -strict-whitespace %s
      5 // RUN: %clang_cc1 -E -std=c11 %s | FileCheck -check-prefix=C99 -strict-whitespace %s
      6 // RUN: %clang_cc1 -E -x c++ %s | FileCheck -check-prefix=GCC -strict-whitespace %s
      7 // RUN: %clang_cc1 -E -std=gnu99 %s | FileCheck -check-prefix=GCC -strict-whitespace %s
      8 // RUN: %clang_cc1 -E -fms-compatibility %s | FileCheck -check-prefix=MS -strict-whitespace %s
      9 // RUN: %clang_cc1 -E -DNAMED %s | FileCheck -check-prefix=GCC -strict-whitespace %s
     10 // RUN: %clang_cc1 -E -std=c99 -DNAMED %s | FileCheck -check-prefix=C99 -strict-whitespace %s
     11 
     12 
     13 #ifndef NAMED
     14 # define A(...)   [ __VA_ARGS__ ]
     15 # define B(...)   [ , __VA_ARGS__ ]
     16 # define C(...)   [ , ## __VA_ARGS__ ]
     17 # define D(A,...) [ A , ## __VA_ARGS__ ]
     18 # define E(A,...) [ __VA_ARGS__ ## A ]
     19 #else
     20 // These are the GCC named argument versions of the C99-style variadic macros.
     21 // Note that __VA_ARGS__ *may* be used as the name, this is not prohibited!
     22 # define A(__VA_ARGS__...)   [ __VA_ARGS__ ]
     23 # define B(__VA_ARGS__...)   [ , __VA_ARGS__ ]
     24 # define C(__VA_ARGS__...)   [ , ## __VA_ARGS__ ]
     25 # define D(A,__VA_ARGS__...) [ A , ## __VA_ARGS__ ]
     26 # define E(A,__VA_ARGS__...) [ __VA_ARGS__ ## A ]
     27 #endif
     28 
     29 
     30 1: A()      B()      C()      D()      E()
     31 2: A(a)     B(a)     C(a)     D(a)     E(a)
     32 3: A(,)     B(,)     C(,)     D(,)     E(,)
     33 4: A(a,b,c) B(a,b,c) C(a,b,c) D(a,b,c) E(a,b,c)
     34 5: A(a,b,)  B(a,b,)  C(a,b,)  D(a,b,)
     35 
     36 // The GCC ", ## __VA_ARGS__" extension swallows the comma when followed by
     37 // empty __VA_ARGS__.  This extension does not apply in -std=c99 mode, but
     38 // does apply in C++.
     39 //
     40 // GCC: 1: [ ] [ , ] [ ] [ ] [ ]
     41 // GCC: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
     42 // GCC: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
     43 // GCC: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
     44 // GCC: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
     45 
     46 // Under C99 standard mode, the GCC ", ## __VA_ARGS__" extension *does not*
     47 // swallow the comma when followed by empty __VA_ARGS__.
     48 //
     49 // C99: 1: [ ] [ , ] [ , ] [ ] [ ]
     50 // C99: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
     51 // C99: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
     52 // C99: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
     53 // C99: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
     54 
     55 // Microsoft's extension is on ", __VA_ARGS__" (without explicit ##) where
     56 // the comma is swallowed when followed by empty __VA_ARGS__.
     57 //
     58 // MS: 1: [ ] [ ] [ ] [ ] [ ]
     59 // MS: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
     60 // MS: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
     61 // MS: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
     62 // MS: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
     63 
     64 // FIXME: Item 3(d) in MS output should be [ ] not [ , ]
     65