// RUN: %clang_cc1 %s -E -verify -fms-extensions
// expected-no-diagnostics

#pragma clang diagnostic ignored "-Wkeyword-macro"

bool f() {
  // Check that operators still work before redefining them.
#if compl 0 bitand 1
  return true and false;
#endif
}

#ifdef and
#endif

// The second 'and' is a valid C++ operator name for '&&'.
#if defined and and defined(and)
#endif

// All c++ keywords should be #define-able in ms mode.
// (operators like "and" aren't normally, the rest always is.)
#define and
#define and_eq
#define alignas
#define alignof
#define asm
#define auto
#define bitand
#define bitor
#define bool
#define break
#define case
#define catch
#define char
#define char16_t
#define char32_t
#define class
#define compl
#define const
#define constexpr
#define const_cast
#define continue
#define decltype
#define default
#define delete
#define double
#define dynamic_cast
#define else
#define enum
#define explicit
#define export
#define extern
#define false
#define float
#define for
#define friend
#define goto
#define if
#define inline
#define int
#define long
#define mutable
#define namespace
#define new
#define noexcept
#define not
#define not_eq
#define nullptr
#define operator
#define or
#define or_eq
#define private
#define protected
#define public
#define register
#define reinterpret_cast
#define return
#define short
#define signed
#define sizeof
#define static
#define static_assert
#define static_cast
#define struct
#define switch
#define template
#define this
#define thread_local
#define throw
#define true
#define try
#define typedef
#define typeid
#define typename
#define union
#define unsigned
#define using
#define virtual
#define void
#define volatile
#define wchar_t
#define while
#define xor
#define xor_eq

// Check this is all properly defined away.
and
and_eq
alignas
alignof
asm
auto
bitand
bitor
bool
break
case
catch
char
char16_t
char32_t
class
compl
const
constexpr
const_cast
continue
decltype
default
delete
double
dynamic_cast
else
enum
explicit
export
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
noexcept
not
not_eq
nullptr
operator
or
or_eq
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_assert
static_cast
struct
switch
template
this
thread_local
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq
