aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/c-family/c-opts.cc13
-rw-r--r--gcc/c-family/c.opt7
-rw-r--r--gcc/cp/module.cc3
-rw-r--r--gcc/doc/cppopts.texi15
-rw-r--r--gcc/doc/invoke.texi5
-rw-r--r--libcpp/files.cc5
-rw-r--r--libcpp/init.cc12
-rw-r--r--libcpp/internal.h2
8 files changed, 50 insertions, 12 deletions
diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index 3f2cabf..f66a0a0 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -770,6 +770,19 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
cpp_opts->traditional = 1;
break;
+ case OPT_fsearch_include_path:
+ cpp_opts->main_search = CMS_user;
+ break;
+
+ case OPT_fsearch_include_path_:
+ if (!strcmp (arg, "user"))
+ cpp_opts->main_search = CMS_user;
+ else if (!strcmp (arg, "system"))
+ cpp_opts->main_search = CMS_system;
+ else
+ error ("invalid argument %qs to %<-fsearch-include-path%>", arg);
+ break;
+
case OPT_v:
verbose = true;
break;
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 61cfe33..8224c82 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -2280,6 +2280,13 @@ frtti
C++ ObjC++ Optimization Var(flag_rtti) Init(1)
Generate run time type descriptor information.
+fsearch-include-path
+C ObjC C++ ObjC++
+Look for the main source file on the include path.
+
+fsearch-include-path=
+C++ ObjC++ Joined RejectNegative Undocumented
+
fshort-enums
C ObjC C++ ObjC++ LTO Optimization Var(flag_short_enums)
Use the narrowest integer type possible for enumeration types.
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index fe9cdd9..27eb39b 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -21224,7 +21224,8 @@ module_preprocess_options (cpp_reader *reader)
}
auto *opt = cpp_get_options (reader);
opt->module_directives = true;
- opt->main_search = cpp_main_search (flag_header_unit);
+ if (opt->main_search == CMS_none)
+ opt->main_search = cpp_main_search (flag_header_unit);
}
}
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index 5b5b084..748db5e 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -270,6 +270,21 @@ When preprocessing, do not shorten system header paths with canonicalization.
@item -fmax-include-depth=@var{depth}
Set the maximum depth of the nested #include. The default is 200.
+@opindex fsearch-include-path
+@item -fsearch-include-path@r{[}=@var{kind}@r{]}
+Look for input files on the #include path, not just the current
+directory. This is particularly useful with C++20 modules, for which
+both header units and module interface units need to be compiled
+directly:
+
+@smallexample
+g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
+@end smallexample
+
+@var{kind} defaults to @samp{user}, which looks on the @code{#include
+"@dots{}"} search path; you can also explicitly specify @samp{system}
+for the @code{#include <@dots{}>} search path.
+
@opindex ftabstop
@item -ftabstop=@var{width}
Set the distance between tab stops. This helps the preprocessor report
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 929feaf..8aeccb1 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -38001,6 +38001,11 @@ installed. Specifying the language as one of these variants also
inhibits output of the object file, as header files have no associated
object file.
+Alternately, or for a module interface unit in an installed location,
+you can use @option{-fsearch-include-path} to specify that the main
+source file should be found on the include path rather than the
+current directory.
+
Header units can be used in much the same way as precompiled headers
(@pxref{Precompiled Headers}), but with fewer restrictions: an
#include that is translated to a header unit import can appear at any
diff --git a/libcpp/files.cc b/libcpp/files.cc
index c63f582..840dffc 100644
--- a/libcpp/files.cc
+++ b/libcpp/files.cc
@@ -189,9 +189,6 @@ static bool read_file_guts (cpp_reader *pfile, _cpp_file *file,
location_t loc, const char *input_charset);
static bool read_file (cpp_reader *pfile, _cpp_file *file,
location_t loc);
-static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
- int angle_brackets, enum include_type,
- bool suppress_diagnostic = false);
static const char *dir_name_of_file (_cpp_file *file);
static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int,
location_t);
@@ -1081,7 +1078,7 @@ _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
/* Return the directory from which searching for FNAME should start,
considering the directive TYPE and ANGLE_BRACKETS. If there is
nothing left in the path, returns NULL. */
-static struct cpp_dir *
+struct cpp_dir *
search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
enum include_type type, bool suppress_diagnostic)
{
diff --git a/libcpp/init.cc b/libcpp/init.cc
index 355e501..3ab120a 100644
--- a/libcpp/init.cc
+++ b/libcpp/init.cc
@@ -744,14 +744,12 @@ cpp_read_main_file (cpp_reader *pfile, const char *fname, bool injecting)
/* Set the default target (if there is none already). */
deps_add_default_target (deps, fname);
+ auto main_search = CPP_OPTION (pfile, main_search);
+ bool angle = main_search == CMS_system;
+ cpp_dir *start_dir = (main_search < CMS_user ? &pfile->no_search_path
+ : search_path_head (pfile, fname, angle, IT_CMDLINE));
pfile->main_file
- = _cpp_find_file (pfile, fname,
- CPP_OPTION (pfile, preprocessed) ? &pfile->no_search_path
- : CPP_OPTION (pfile, main_search) == CMS_user
- ? pfile->quote_include
- : CPP_OPTION (pfile, main_search) == CMS_system
- ? pfile->bracket_include : &pfile->no_search_path,
- /*angle=*/0, _cpp_FFK_NORMAL, 0);
+ = _cpp_find_file (pfile, fname, start_dir, angle, _cpp_FFK_NORMAL, 0);
if (_cpp_find_failed (pfile->main_file))
return NULL;
diff --git a/libcpp/internal.h b/libcpp/internal.h
index e65198e..d91acd6 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -766,6 +766,8 @@ extern _cpp_file *_cpp_find_file (cpp_reader *, const char *, cpp_dir *,
int angle, _cpp_find_file_kind, location_t);
extern bool _cpp_find_failed (_cpp_file *);
extern void _cpp_mark_file_once_only (cpp_reader *, struct _cpp_file *);
+extern cpp_dir *search_path_head (cpp_reader *, const char *, int,
+ include_type, bool = false);
extern const char *_cpp_find_header_unit (cpp_reader *, const char *file,
bool angle_p, location_t);
extern int _cpp_stack_embed (cpp_reader *, const char *, bool,