diff options
-rw-r--r-- | gcc/c-family/c-opts.cc | 13 | ||||
-rw-r--r-- | gcc/c-family/c.opt | 7 | ||||
-rw-r--r-- | gcc/cp/module.cc | 3 | ||||
-rw-r--r-- | gcc/doc/cppopts.texi | 15 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 5 | ||||
-rw-r--r-- | libcpp/files.cc | 5 | ||||
-rw-r--r-- | libcpp/init.cc | 12 | ||||
-rw-r--r-- | libcpp/internal.h | 2 |
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, |