]> granicus.if.org Git - clang/commitdiff
Improve the diagnostic for #include_next occurring in a file not found
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 21 Mar 2019 20:42:13 +0000 (20:42 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 21 Mar 2019 20:42:13 +0000 (20:42 +0000)
in the include path.

Instead of making the incorrect claim that the included file has an
absolute path, describe the actual problem: the including file was found
either by absolute path, or relative to such a file, or relative to the
primary source file.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@356712 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/PPDirectives.cpp
test/Preprocessor/Inputs/include-next-1/bar.h [new file with mode: 0644]
test/Preprocessor/Inputs/include-next-1/foo.h [new file with mode: 0644]
test/Preprocessor/Inputs/include-next-2/bar.h [new file with mode: 0644]
test/Preprocessor/include-next.c [new file with mode: 0644]

index 45e50c9a8cdba182978fd2bf92ed30b3255dca38..48d9551d6867dbd511d730ec262087b869ec256a 100644 (file)
@@ -268,12 +268,14 @@ def err_pp_hash_error : Error<"%0">;
 }
 
 def pp_include_next_in_primary : Warning<
-  "#include_next in primary source file">,
+  "#include_next in primary source file; "
+  "will search from start of include path">,
   InGroup<DiagGroup<"include-next-outside-header">>;
 def pp_include_macros_out_of_predefines : Error<
   "the #__include_macros directive is only for internal use by -imacros">;
 def pp_include_next_absolute_path : Warning<
-  "#include_next with absolute path">,
+  "#include_next in file found relative to primary source file or found by "
+  "absolute path; will search from start of include path">,
   InGroup<DiagGroup<"include-next-absolute-path">>;
 def ext_c99_whitespace_required_after_macro_name : ExtWarn<
   "ISO C99 requires whitespace after the macro name">, InGroup<C99>;
index 179b0cbf6960b0c1b7a3e1eb495b25cd9b2d1be5..1850af9cfa4f436d5d1a1d29ec0df21bbaa06b54 100644 (file)
@@ -2085,6 +2085,10 @@ void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
     LookupFromFile = CurPPLexer->getFileEntry();
     Lookup = nullptr;
   } else if (!Lookup) {
+    // The current file was not found by walking the include path. Either it
+    // is the primary file (handled above), or it was found by absolute path,
+    // or it was found relative to such a file.
+    // FIXME: Track enough information so we know which case we're in.
     Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
   } else {
     // Start looking up in the next directory.
diff --git a/test/Preprocessor/Inputs/include-next-1/bar.h b/test/Preprocessor/Inputs/include-next-1/bar.h
new file mode 100644 (file)
index 0000000..1cf97ae
--- /dev/null
@@ -0,0 +1 @@
+#define BAR 1
diff --git a/test/Preprocessor/Inputs/include-next-1/foo.h b/test/Preprocessor/Inputs/include-next-1/foo.h
new file mode 100644 (file)
index 0000000..7d2753c
--- /dev/null
@@ -0,0 +1 @@
+#include_next "bar.h"
diff --git a/test/Preprocessor/Inputs/include-next-2/bar.h b/test/Preprocessor/Inputs/include-next-2/bar.h
new file mode 100644 (file)
index 0000000..3ac8411
--- /dev/null
@@ -0,0 +1 @@
+#define BAR 2
diff --git a/test/Preprocessor/include-next.c b/test/Preprocessor/include-next.c
new file mode 100644 (file)
index 0000000..4b9a0e8
--- /dev/null
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=1
+// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=2
+// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=3
+
+#if TEST == 1
+// expected-warning@+1 {{#include_next in primary source file}}
+#include_next "bar.h"
+#if BAR != 1
+#error wrong bar
+#endif
+
+#elif TEST == 2
+// expected-no-diagnostics
+#include "foo.h"
+#if BAR != 2
+#error wrong bar
+#endif
+
+#elif TEST == 3
+// expected-warning@foo.h:1 {{#include_next in file found relative to primary source file or found by absolute path}}
+#include "Inputs/include-next-1/foo.h"
+#if BAR != 1
+#error wrong bar
+#endif
+#undef BAR
+
+#else
+#error unknown test
+#endif