Fix rdar://6814950 - stdint.h isn't "-pedantic -std=c89" clean,
by marking the predefines buffer as a system header. The problem with stdint is that it was getting problems like this: /Volumes/Projects/cvs/llvm/Debug/lib/clang/1.0/include/stdint.h:43:9: warning: 'long long' is an extension when C99 mode is not enabled typedef __INT64_TYPE__ int64_t; ^ <built-in>:73:29: note: instantiated from: #define __INT64_TYPE__ long long ^ We correctly silence warnings in system headers, but only if the spelling location of the token came from the system header. This is designed so that if you use a system macro in your code that you don't get punished for its definition. This is all cool except that the predefines buffer wasn't considered a system header. llvm-svn: 69770
This commit is contained in:
parent
2dfdb3ea94
commit
ed462a8d44
|
@ -417,13 +417,17 @@ bool InitializePreprocessor(Preprocessor &PP,
|
|||
const PreprocessorInitOptions& InitOpts) {
|
||||
std::vector<char> PredefineBuffer;
|
||||
|
||||
const char *LineDirective = "# 1 \"<built-in>\" 3\n";
|
||||
PredefineBuffer.insert(PredefineBuffer.end(),
|
||||
LineDirective, LineDirective+strlen(LineDirective));
|
||||
|
||||
// Install things like __POWERPC__, __GNUC__, etc into the macro table.
|
||||
InitializePredefinedMacros(PP.getTargetInfo(), PP.getLangOptions(),
|
||||
PredefineBuffer);
|
||||
|
||||
// Add on the predefines from the driver. Wrap in a #line directive to report
|
||||
// that they come from the command line.
|
||||
const char *LineDirective = "# 1 \"<command line>\" 1\n";
|
||||
LineDirective = "# 1 \"<command line>\" 1\n";
|
||||
PredefineBuffer.insert(PredefineBuffer.end(),
|
||||
LineDirective, LineDirective+strlen(LineDirective));
|
||||
|
||||
|
@ -451,7 +455,7 @@ bool InitializePreprocessor(Preprocessor &PP,
|
|||
AddImplicitInclude(PredefineBuffer, I->first);
|
||||
}
|
||||
|
||||
LineDirective = "# 2 \"<built-in>\" 2\n";
|
||||
LineDirective = "# 2 \"<built-in>\" 2 3\n";
|
||||
PredefineBuffer.insert(PredefineBuffer.end(),
|
||||
LineDirective, LineDirective+strlen(LineDirective));
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
/* RUN: clang-cc -fsyntax-only -verify -std=c89 -pedantic-errors %s
|
||||
* rdar://6814950
|
||||
*/
|
||||
#include <stdint.h>
|
||||
|
|
@ -40,7 +40,7 @@ void test2() {
|
|||
|
||||
foo:
|
||||
takeclosure(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}}
|
||||
__block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}}
|
||||
__block y = 7;
|
||||
takeclosure(^{ y = 8; });
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue