<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On 27 Oct 2016 7:26 am, "Erik Verbruggen via cfe-commits" <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: erikjv<br>
Date: Thu Oct 27 09:17:10 2016<br>
New Revision: 285295<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=285295&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=285295&view=rev</a><br>
Log:<br>
Do not print include_next/pragma once warnings when input is a header.<br>
<br>
r276653 suppressed the pragma once warning when generating a PCH file.<br>
This patch extends that to any main file for which clang is told (with<br>
the -x option) that it's a header file. It will also suppress the<br>
warning "#include_next in primary source file".<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D25989" rel="noreferrer" target="_blank">http://reviews.llvm.org/D25989</a><br>
<br>
Added:<br>
    cfe/trunk/test/Preprocessor/<wbr>header_is_main_file.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>LangOptions.h<br>
    cfe/trunk/lib/Basic/<wbr>LangOptions.cpp<br>
    cfe/trunk/lib/Frontend/<wbr>CompilerInvocation.cpp<br>
    cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp<br>
    cfe/trunk/lib/Lex/<wbr>PPMacroExpansion.cpp<br>
    cfe/trunk/lib/Lex/Pragma.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>LangOptions.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/LangOptions.h?rev=<wbr>285295&r1=285294&r2=285295&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>LangOptions.h (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>LangOptions.h Thu Oct 27 09:17:10 2016<br>
@@ -132,6 +132,10 @@ public:<br>
   /// host code generation.<br>
   std::string OMPHostIRFile;<br>
<br>
+  /// \brief Indicates whether the front-end is explicitly told that the<br>
+  /// input is a header file (i.e. -x c-header).<br>
+  bool IsHeaderFile;<br>
+<br>
   LangOptions();<br>
<br>
   // Define accessors/mutators for language options of enumeration type.<br>
<br>
Modified: cfe/trunk/lib/Basic/<wbr>LangOptions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/LangOptions.cpp?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Basic/<wbr>LangOptions.cpp?rev=285295&r1=<wbr>285294&r2=285295&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Basic/<wbr>LangOptions.cpp (original)<br>
+++ cfe/trunk/lib/Basic/<wbr>LangOptions.cpp Thu Oct 27 09:17:10 2016<br>
@@ -15,7 +15,8 @@<br>
<br>
 using namespace clang;<br>
<br>
-LangOptions::LangOptions() {<br>
+LangOptions::LangOptions()<br>
+  : IsHeaderFile(false) {<br>
 #define LANGOPT(Name, Bits, Default, Description) Name = Default;<br>
 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) set##Name(Default);<br>
 #include "clang/Basic/LangOptions.def"<br>
@@ -34,6 +35,7 @@ void LangOptions::<wbr>resetNonModularOptions<br>
   SanitizerBlacklistFiles.clear(<wbr>);<br>
<br>
   CurrentModule.clear();<br>
+  IsHeaderFile = false;<br>
 }<br>
<br>
 bool LangOptions::isNoBuiltinFunc(<wbr>StringRef FuncName) const {<br>
<br>
Modified: cfe/trunk/lib/Frontend/<wbr>CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Frontend/CompilerInvocation.<wbr>cpp?rev=285295&r1=285294&r2=<wbr>285295&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Frontend/<wbr>CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/<wbr>CompilerInvocation.cpp Thu Oct 27 09:17:10 2016<br>
@@ -1111,7 +1111,8 @@ static bool parseTestModuleFileExtension<br>
 }<br>
<br>
 static InputKind ParseFrontendArgs(<wbr>FrontendOptions &Opts, ArgList &Args,<br>
-                                   DiagnosticsEngine &Diags) {<br>
+                                   DiagnosticsEngine &Diags,<br>
+                                   bool &IsHeaderFile) {<br>
   using namespace options;<br>
   Opts.ProgramAction = frontend::ParseSyntaxOnly;<br>
   if (const Arg *A = Args.getLastArg(OPT_Action_<wbr>Group)) {<br>
@@ -1358,6 +1359,13 @@ static InputKind ParseFrontendArgs(Front<br>
     if (DashX == IK_None)<br>
       Diags.Report(diag::err_drv_<wbr>invalid_value)<br>
         << A->getAsString(Args) << A->getValue();<br>
+    IsHeaderFile = llvm::StringSwitch<bool>(A-><wbr>getValue())<br></blockquote></div></div></div><div><br></div><div>Is there a reason to keep this separate from TUKind? TU_Prefix and this flag appear to mean the same thing.</div><div><br></div><div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      .Case("c-header", true)<br>
+      .Case("cl-header", true)<br>
+      .Case("objective-c-header", true)<br>
+      .Case("c++-header", true)<br>
+      .Case("objective-c++-header", true)<br>
+      .Default(false);<br>
   }<br>
<br>
   // '-' is the default input if none is given.<br>
@@ -2415,7 +2423,8 @@ bool CompilerInvocation::<wbr>CreateFromArgs(<br>
   ParseCommentArgs(LangOpts.<wbr>CommentOpts, Args);<br>
   ParseFileSystemArgs(Res.<wbr>getFileSystemOpts(), Args);<br>
   // FIXME: We shouldn't have to pass the DashX option around here<br>
-  InputKind DashX = ParseFrontendArgs(Res.<wbr>getFrontendOpts(), Args, Diags);<br>
+  InputKind DashX = ParseFrontendArgs(Res.<wbr>getFrontendOpts(), Args, Diags,<br>
+                                      LangOpts.IsHeaderFile);<br>
   ParseTargetArgs(Res.<wbr>getTargetOpts(), Args, Diags);<br>
   Success &= ParseCodeGenArgs(Res.<wbr>getCodeGenOpts(), Args, DashX, Diags,<br>
                               Res.getTargetOpts());<br>
<br>
Modified: cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp?rev=285295&<wbr>r1=285294&r2=285295&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp (original)<br>
+++ cfe/trunk/lib/Lex/<wbr>PPDirectives.cpp Thu Oct 27 09:17:10 2016<br>
@@ -2058,7 +2058,11 @@ void Preprocessor::<wbr>HandleIncludeNextDire<br>
   // diagnostic.<br>
   const DirectoryLookup *Lookup = CurDirLookup;<br>
   const FileEntry *LookupFromFile = nullptr;<br>
-  if (isInPrimaryFile()) {<br>
+  if (isInPrimaryFile() && LangOpts.IsHeaderFile) {<br>
+    // If the main file is a header, then it's either for PCH/AST generation,<br>
+    // or libclang opened it. Either way, handle it as a normal include below<br>
+    // and do not complain about include_next.<br>
+  } else if (isInPrimaryFile()) {<br>
     Lookup = nullptr;<br>
     Diag(IncludeNextTok, diag::pp_include_next_in_<wbr>primary);<br>
   } else if (CurSubmodule) {<br>
<br>
Modified: cfe/trunk/lib/Lex/<wbr>PPMacroExpansion.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>PPMacroExpansion.cpp?rev=<wbr>285295&r1=285294&r2=285295&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/<wbr>PPMacroExpansion.cpp (original)<br>
+++ cfe/trunk/lib/Lex/<wbr>PPMacroExpansion.cpp Thu Oct 27 09:17:10 2016<br>
@@ -1421,7 +1421,11 @@ static bool EvaluateHasIncludeNext(Token<br>
   // Preprocessor::<wbr>HandleIncludeNextDirective.<br>
   const DirectoryLookup *Lookup = PP.GetCurDirLookup();<br>
   const FileEntry *LookupFromFile = nullptr;<br>
-  if (PP.isInPrimaryFile()) {<br>
+  if (PP.isInPrimaryFile() && PP.getLangOpts().IsHeaderFile) {<br>
+    // If the main file is a header, then it's either for PCH/AST generation,<br>
+    // or libclang opened it. Either way, handle it as a normal include below<br>
+    // and do not complain about __has_include_next.<br>
+  } else if (PP.isInPrimaryFile()) {<br>
     Lookup = nullptr;<br>
     PP.Diag(Tok, diag::pp_include_next_in_<wbr>primary);<br>
   } else if (PP.getCurrentSubmodule()) {<br>
<br>
Modified: cfe/trunk/lib/Lex/Pragma.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Pragma.cpp?rev=285295&r1=285294&r2=285295&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Lex/<wbr>Pragma.cpp?rev=285295&r1=<wbr>285294&r2=285295&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Lex/Pragma.cpp (original)<br>
+++ cfe/trunk/lib/Lex/Pragma.cpp Thu Oct 27 09:17:10 2016<br>
@@ -372,8 +372,10 @@ void Preprocessor::HandleMicrosoft_<wbr>_prag<br>
 ///<br>
 void Preprocessor::<wbr>HandlePragmaOnce(Token &OnceTok) {<br>
   // Don't honor the 'once' when handling the primary source file, unless<br>
-  // this is a prefix to a TU, which indicates we're generating a PCH file.<br>
-  if (isInPrimaryFile() && TUKind != TU_Prefix) {<br>
+  // this is a prefix to a TU, which indicates we're generating a PCH file, or<br>
+  // when the main file is a header (e.g. when -xc-header is provided on the<br>
+  // commandline).<br>
+  if (isInPrimaryFile() && TUKind != TU_Prefix && !getLangOpts().IsHeaderFile) {<br>
     Diag(OnceTok, diag::pp_pragma_once_in_main_<wbr>file);<br>
     return;<br>
   }<br>
<br>
Added: cfe/trunk/test/Preprocessor/<wbr>header_is_main_file.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/header_is_main_file.c?rev=285295&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Preprocessor/header_is_main_<wbr>file.c?rev=285295&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Preprocessor/<wbr>header_is_main_file.c (added)<br>
+++ cfe/trunk/test/Preprocessor/<wbr>header_is_main_file.c Thu Oct 27 09:17:10 2016<br>
@@ -0,0 +1,8 @@<br>
+// RUN: %clang_cc1 -x c-header -ffreestanding -Eonly -verify %s<br>
+// expected-no-diagnostics<br>
+<br>
+#pragma once<br>
+#include_next "stdint.h"<br>
+#if !__has_include_next("stdint.h"<wbr>)<br>
+#error "__has_include_next failed"<br>
+#endif<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div></div>