// Test the __VA_ARGS__ comma swallowing extensions of various compiler dialects.
// RUN: %clang_cc1 -E %s | FileCheck -check-prefix=GCC -strict-whitespace %s
// RUN: %clang_cc1 -E -std=c99 %s | FileCheck -check-prefix=C99 -strict-whitespace %s
// RUN: %clang_cc1 -E -std=c11 %s | FileCheck -check-prefix=C99 -strict-whitespace %s
// RUN: %clang_cc1 -E -x c++ %s | FileCheck -check-prefix=GCC -strict-whitespace %s
// RUN: %clang_cc1 -E -std=gnu99 %s | FileCheck -check-prefix=GCC -strict-whitespace %s
// RUN: %clang_cc1 -E -fms-compatibility %s | FileCheck -check-prefix=MS -strict-whitespace %s
// RUN: %clang_cc1 -E -DNAMED %s | FileCheck -check-prefix=GCC -strict-whitespace %s
// RUN: %clang_cc1 -E -std=c99 -DNAMED %s | FileCheck -check-prefix=C99 -strict-whitespace %s
// These are the GCC named argument versions of the C99-style variadic macros.
// Note that __VA_ARGS__ *may* be used as the name, this is not prohibited!
1:
2:
3:
4:
5:
// The GCC ", ## __VA_ARGS__" extension swallows the comma when followed by
// empty __VA_ARGS__. This extension does not apply in -std=c99 mode, but
// does apply in C++.
//
// GCC: 1: [ ] [ , ] [ ] [ ] [ ]
// GCC: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
// GCC: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
// GCC: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
// GCC: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
// Under C99 standard mode, the GCC ", ## __VA_ARGS__" extension *does not*
// swallow the comma when followed by empty __VA_ARGS__.
//
// C99: 1: [ ] [ , ] [ , ] [ ] [ ]
// C99: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
// C99: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
// C99: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
// C99: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
// Microsoft's extension is on ", __VA_ARGS__" (without explicit ##) where
// the comma is swallowed when followed by empty __VA_ARGS__.
//
// MS: 1: [ ] [ ] [ ] [ ] [ ]
// MS: 2: [ a ] [ , a ] [ ,a ] [ a ] [ a ]
// MS: 3: [ , ] [ , , ] [ ,, ] [ , ] [ ]
// MS: 4: [ a,b,c ] [ , a,b,c ] [ ,a,b,c ] [ a ,b,c ] [ b,ca ]
// MS: 5: [ a,b, ] [ , a,b, ] [ ,a,b, ] [ a ,b, ]
// FIXME: Item 3(d) in MS output should be [ ] not [ , ]