tl;dr: Teach Clang to work around g++ changing its workaround to glibc's
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 12 Apr 2013 22:11:07 +0000 (22:11 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 12 Apr 2013 22:11:07 +0000 (22:11 +0000)
commit23628297342dfd8b6b98e0cb1a14dab0975c5f9e
tree790155a082e85dd1fc3e840ee25c685c0847cbcf
parent4e4d45e507dfbac96b0db6ea6fb01c153909208c
tl;dr: Teach Clang to work around g++ changing its workaround to glibc's
implementation of C99's attempt to control the C++ standard. *sigh*

The C99 standard says that certain macros in <stdint.h>, such as SIZE_MAX,
should not be defined when the header is included in C++ mode, unless
__STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS are defined. The C++11 standard
says "Thanks, but no thanks" and C11 removed this rule, but various C library
implementations (such as glibc) follow C99 anyway.

g++ prior to 4.8 worked around the C99 / glibc behavior by defining
__STDC_*_MACROS in <cstdint>, which was incorrect, because <stdint.h> is
supposed to provide these macros too. g++ 4.8 works around it by defining
__STDC_*_MACROS in its builtin <stdint.h> header.

This change makes Clang act like g++ 4.8 in this regard: our <stdint.h> now
countermands any attempt by the C library to implement the undesired C99 rules,
by defining the __STDC_*_MACROS first. Unlike g++, we do this even in C++98
mode, since that was the intent of the C++ committee, matches the behavior
required in C11, and matches our built-in implementation of <stdint.h>.

llvm-svn: 179419
clang/lib/Headers/stdint.h
clang/test/Headers/cxx11.cpp