From: Argyrios Kyrtzidis Date: Fri, 7 Mar 2014 07:47:58 +0000 (+0000) Subject: [Preprocessor] Pass TranslationUnitKind to the preprocessor and if it is TU_Prefix X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ddea7155402b971fff22173cfa9912117da68ce4;p=clang [Preprocessor] Pass TranslationUnitKind to the preprocessor and if it is TU_Prefix avoid warning for unused macros. rdar://15034698 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203213 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index 3079a06413..29627fa23d 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -561,7 +561,7 @@ public: /// Create the preprocessor, using the invocation, file, and source managers, /// and replace any existing one with it. - void createPreprocessor(); + void createPreprocessor(TranslationUnitKind TUKind); /// Create the AST context. void createASTContext(); diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 8ea67ab532..d01c4a1ff4 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -200,6 +200,9 @@ class Preprocessor : public RefCountedBase { /// avoid tearing the Lexer and etc. down). bool IncrementalProcessing; + /// The kind of translation unit we are processing. + TranslationUnitKind TUKind; + /// \brief The code-completion handler. CodeCompletionHandler *CodeComplete; @@ -439,7 +442,8 @@ public: IdentifierInfoLookup *IILookup = 0, bool OwnsHeaderSearch = false, bool DelayInitialization = false, - bool IncrProcessing = false); + bool IncrProcessing = false, + TranslationUnitKind TUKind = TU_Complete); ~Preprocessor(); diff --git a/lib/Frontend/ChainedIncludesSource.cpp b/lib/Frontend/ChainedIncludesSource.cpp index ab5c81fb58..1bdd48e168 100644 --- a/lib/Frontend/ChainedIncludesSource.cpp +++ b/lib/Frontend/ChainedIncludesSource.cpp @@ -104,7 +104,7 @@ ChainedIncludesSource::create(CompilerInstance &CI) { &Clang->getTargetOpts())); Clang->createFileManager(); Clang->createSourceManager(Clang->getFileManager()); - Clang->createPreprocessor(); + Clang->createPreprocessor(TU_Prefix); Clang->getDiagnosticClient().BeginSourceFile(Clang->getLangOpts(), &Clang->getPreprocessor()); Clang->createASTContext(); diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index f10311a4ea..be1a540268 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -223,7 +223,7 @@ void CompilerInstance::createSourceManager(FileManager &FileMgr) { // Preprocessor -void CompilerInstance::createPreprocessor() { +void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { const PreprocessorOptions &PPOpts = getPreprocessorOpts(); // Create a PTH manager if we are using some form of a token cache. @@ -240,7 +240,10 @@ void CompilerInstance::createPreprocessor() { PP = new Preprocessor(&getPreprocessorOpts(), getDiagnostics(), getLangOpts(), &getTarget(), getSourceManager(), *HeaderInfo, *this, PTHMgr, - /*OwnsHeaderSearch=*/true); + /*OwnsHeaderSearch=*/true, + /*DelayInitialization=*/false, + /*IncrProcessing=*/false, + TUKind); // Note that this is different then passing PTHMgr to Preprocessor's ctor. // That argument is used as the IdentifierInfoLookup argument to diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index f028a56053..6cebeadee9 100644 --- a/lib/Frontend/FrontendAction.cpp +++ b/lib/Frontend/FrontendAction.cpp @@ -291,7 +291,7 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, } // Set up the preprocessor. - CI.createPreprocessor(); + CI.createPreprocessor(getTranslationUnitKind()); // Inform the diagnostic client we are processing a source file. CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 4170fc3316..218c5d4ebd 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -427,11 +427,15 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { if (!isIncrementalProcessingEnabled()) CurPPLexer = 0; - // This is the end of the top-level file. 'WarnUnusedMacroLocs' has collected - // all macro locations that we need to warn because they are not used. - for (WarnUnusedMacroLocsTy::iterator - I=WarnUnusedMacroLocs.begin(), E=WarnUnusedMacroLocs.end(); I!=E; ++I) - Diag(*I, diag::pp_macro_not_used); + if (TUKind != TU_Prefix) { + // This is the end of the top-level file. 'WarnUnusedMacroLocs' has + // collected all macro locations that we need to warn because they are not + // used. + for (WarnUnusedMacroLocsTy::iterator + I=WarnUnusedMacroLocs.begin(), E=WarnUnusedMacroLocs.end(); + I!=E; ++I) + Diag(*I, diag::pp_macro_not_used); + } // If we are building a module that has an umbrella header, make sure that // each of the headers within the directory covered by the umbrella header diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index e7d844087c..2125d180e8 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -59,11 +59,13 @@ Preprocessor::Preprocessor(IntrusiveRefCntPtr PPOpts, const TargetInfo *target, SourceManager &SM, HeaderSearch &Headers, ModuleLoader &TheModuleLoader, IdentifierInfoLookup *IILookup, bool OwnsHeaders, - bool DelayInitialization, bool IncrProcessing) + bool DelayInitialization, bool IncrProcessing, + TranslationUnitKind TUKind) : PPOpts(PPOpts), Diags(&diags), LangOpts(opts), Target(target), FileMgr(Headers.getFileMgr()), SourceMgr(SM), HeaderInfo(Headers), TheModuleLoader(TheModuleLoader), ExternalSource(0), Identifiers(opts, IILookup), IncrementalProcessing(IncrProcessing), + TUKind(TUKind), CodeComplete(0), CodeCompletionFile(0), CodeCompletionOffset(0), LastTokenWasAt(false), ModuleImportExpectsIdentifier(false), CodeCompletionReached(0), SkipMainFilePreamble(0, true), CurPPLexer(0), diff --git a/test/Index/preamble.c b/test/Index/preamble.c index d69644f6da..ae8e1aa6a5 100644 --- a/test/Index/preamble.c +++ b/test/Index/preamble.c @@ -2,13 +2,16 @@ #include "preamble.h" #include "preamble-with-error.h" +#define MACRO_UNUSED 1 +#define MACRO_USED 2 + int wibble(int); void f(int x) { - + x = MACRO_USED } // RUN: c-index-test -write-pch %t.pch -x c-header %S/Inputs/prefix.h -// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 5 local -I %S/Inputs -include %t %s 2> %t.stderr.txt | FileCheck %s +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 5 local -I %S/Inputs -include %t %s -Wunused-macros 2> %t.stderr.txt | FileCheck %s // RUN: FileCheck -check-prefix CHECK-DIAG %s < %t.stderr.txt // CHECK: preamble.h:1:12: FunctionDecl=bar:1:12 (Definition) Extent=[1:1 - 6:2] // CHECK: preamble.h:4:3: BinaryOperator= Extent=[4:3 - 4:13] @@ -16,10 +19,13 @@ void f(int x) { // CHECK: preamble.h:4:9: UnexposedExpr=ptr1:3:10 Extent=[4:9 - 4:13] // CHECK: preamble.h:4:9: DeclRefExpr=ptr1:3:10 Extent=[4:9 - 4:13] // CHECK: preamble.h:5:10: IntegerLiteral= Extent=[5:10 - 5:11] -// CHECK: preamble.c:5:5: FunctionDecl=wibble:5:5 Extent=[5:1 - 5:16] -// CHECK: preamble.c:5:15: ParmDecl=:5:15 (Definition) Extent=[5:12 - 5:15] +// CHECK: preamble.c:8:5: FunctionDecl=wibble:8:5 Extent=[8:1 - 8:16] +// CHECK: preamble.c:8:15: ParmDecl=:8:15 (Definition) Extent=[8:12 - 8:15] // CHECK-DIAG: preamble.h:4:7:{4:9-4:13}: warning: incompatible pointer types assigning to 'int *' from 'float *' -// RUN: env CINDEXTEST_EDITING=1 c-index-test -code-completion-at=%s:8:1 -I %S/Inputs -include %t %s 2> %t.stderr.txt | FileCheck -check-prefix CHECK-CC %s +// FIXME: Should see: +// preamble.c:5:9: warning: macro is not used +// CHECK-DIAG-NOT: preamble.c:6:9: warning: macro is not used +// RUN: env CINDEXTEST_EDITING=1 c-index-test -code-completion-at=%s:11:1 -I %S/Inputs -include %t %s 2> %t.stderr.txt | FileCheck -check-prefix CHECK-CC %s // CHECK-CC: FunctionDecl:{ResultType int}{TypedText bar}{LeftParen (}{Placeholder int i}{RightParen )} (50) // CHECK-CC: FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder int x}{RightParen )} (50) // CHECK-CC: FunctionDecl:{ResultType int}{TypedText foo}{LeftParen (}{Placeholder int}{RightParen )} (50)