forked from OSchip/llvm-project
[frontend] Don't put a PCH/PTH filename into the set of includes in the preprocessor options;
since only one of them is allowed in command-line, process them separately. Otherwise, if more than one is specified in the command-line, one is processed normally and the others are going to be treated and included as header files. Related to radar://13140508 llvm-svn: 174385
This commit is contained in:
parent
b76de88288
commit
48b72d81c8
|
@ -1345,8 +1345,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
||||||
Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
|
Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
|
||||||
|
|
||||||
// Add the ordered list of -includes.
|
// Add the ordered list of -includes.
|
||||||
for (arg_iterator it = Args.filtered_begin(OPT_include, OPT_include_pch,
|
for (arg_iterator it = Args.filtered_begin(OPT_include),
|
||||||
OPT_include_pth),
|
|
||||||
ie = Args.filtered_end(); it != ie; ++it) {
|
ie = Args.filtered_end(); it != ie; ++it) {
|
||||||
const Arg *A = *it;
|
const Arg *A = *it;
|
||||||
Opts.Includes.push_back(A->getValue());
|
Opts.Includes.push_back(A->getValue());
|
||||||
|
|
|
@ -247,16 +247,8 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
|
||||||
CI.getLangOpts(),
|
CI.getLangOpts(),
|
||||||
CI.getTargetOpts(),
|
CI.getTargetOpts(),
|
||||||
CI.getPreprocessorOpts())) {
|
CI.getPreprocessorOpts())) {
|
||||||
for (unsigned I = 0, N = PPOpts.Includes.size(); I != N; ++I) {
|
PPOpts.ImplicitPCHInclude = Dir->path();
|
||||||
if (PPOpts.Includes[I] == PPOpts.ImplicitPCHInclude) {
|
Found = true;
|
||||||
PPOpts.Includes[I] = Dir->path();
|
|
||||||
PPOpts.ImplicitPCHInclude = Dir->path();
|
|
||||||
Found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(Found && "Implicit PCH include not in includes list?");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -784,15 +784,16 @@ void clang::InitializePreprocessor(Preprocessor &PP,
|
||||||
AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i],
|
AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i],
|
||||||
PP.getFileManager());
|
PP.getFileManager());
|
||||||
|
|
||||||
|
// Process -include-pch/-include-pth directives.
|
||||||
|
if (!InitOpts.ImplicitPCHInclude.empty())
|
||||||
|
AddImplicitIncludePCH(Builder, PP, InitOpts.ImplicitPCHInclude);
|
||||||
|
if (!InitOpts.ImplicitPTHInclude.empty())
|
||||||
|
AddImplicitIncludePTH(Builder, PP, InitOpts.ImplicitPTHInclude);
|
||||||
|
|
||||||
// Process -include directives.
|
// Process -include directives.
|
||||||
for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {
|
for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {
|
||||||
const std::string &Path = InitOpts.Includes[i];
|
const std::string &Path = InitOpts.Includes[i];
|
||||||
if (Path == InitOpts.ImplicitPTHInclude)
|
AddImplicitInclude(Builder, Path, PP.getFileManager());
|
||||||
AddImplicitIncludePTH(Builder, PP, Path);
|
|
||||||
else if (Path == InitOpts.ImplicitPCHInclude)
|
|
||||||
AddImplicitIncludePCH(Builder, PP, Path);
|
|
||||||
else
|
|
||||||
AddImplicitInclude(Builder, Path, PP.getFileManager());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exit the command line and go back to <built-in> (2 is LC_LEAVE).
|
// Exit the command line and go back to <built-in> (2 is LC_LEAVE).
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
// RUN: %clang_cc1 -emit-pch -o %t1.pch %s
|
||||||
|
// RUN: %clang_cc1 -emit-pch -o %t2.pch %s
|
||||||
|
// RUN: %clang_cc1 %s -include-pch %t1.pch -include-pch %t2.pch -verify
|
||||||
|
|
||||||
|
#ifndef HEADER
|
||||||
|
#define HEADER
|
||||||
|
|
||||||
|
extern int x;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#warning parsed this
|
||||||
|
// expected-warning@-1 {{parsed this}}
|
||||||
|
int foo() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue