HelpText<"Restrict all prior -I flags to double-quoted inclusion and "
"remove current directory from include path">;
def I : JoinedOrSeparate<["-"], "I">, Group<I_Group>,
- Flags<[CC1Option,CC1AsOption]>, MetaVarName<"<dir>">,
+ Flags<[CC1Option,CC1AsOption,FlangOption,FC1Option]>, MetaVarName<"<dir>">,
HelpText<"Add directory to the end of the list of include search paths">,
DocBrief<[{Add directory to include search path. For C++ inputs, if
there are multiple -I options, these directories are searched
void Flang::AddPreprocessingOptions(const ArgList &Args,
ArgStringList &CmdArgs) const {
- Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U});
+ Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
}
void Flang::ConstructJob(Compilation &C, const JobAction &JA,
class PreprocessorOptions {
public:
std::vector<std::pair<std::string, /*isUndef*/ bool>> macros;
+ // Search directories specified by the user with -I
+ // TODO: When adding support for more options related to search paths,
+ // consider collecting them in a separate aggregate. For now we keep it here
+ // as there is no point creating a class for just one field.
+ std::vector<std::string> searchDirectoriesFromDashI;
public:
PreprocessorOptions() {}
opts.addMacroUndef(currentArg->getValue());
}
}
+
+ // Add the ordered list of -I's.
+ for (const auto *currentArg : args.filtered(clang::driver::options::OPT_I))
+ opts.searchDirectoriesFromDashI.emplace_back(currentArg->getValue());
}
bool CompilerInvocation::CreateFromArgs(CompilerInvocation &res,
const auto &preprocessorOptions = preprocessorOpts();
collectMacroDefinitions(preprocessorOptions, fortranOptions);
+
+ fortranOptions.searchDirectories.insert(
+ fortranOptions.searchDirectories.end(),
+ preprocessorOptions.searchDirectoriesFromDashI.begin(),
+ preprocessorOptions.searchDirectoriesFromDashI.end());
}
--- /dev/null
+#define X MainDirectoryOne
--- /dev/null
+#define Y MainDirectoryTwo
--- /dev/null
+NOT A REAL MODULE FILE - USE THIS ONLY FOR TESTING THE DRIVER
--- /dev/null
+#define X SubDirectoryOne
--- /dev/null
+#define Y SubDirectoryTwo
--- /dev/null
+NOT A REAL MODULE FILE - USE THIS ONLY FOR TESTING THE DRIVER
! CHECK-NEXT: -fcolor-diagnostics Enable colors in diagnostics
! CHECK-NEXT: -fno-color-diagnostics Disable colors in diagnostics
! CHECK-NEXT: -help Display available options
+! CHECK-NEXT: -I <dir> Add directory to the end of the list of include search paths
! CHECK-NEXT: -o <file> Write output to <file>
! CHECK-NEXT: -test-io Run the InputOuputTest action. Use for development and testing only.
! CHECK-NEXT: -U <macro> Undefine macro <macro>
! HELP-NEXT: -fcolor-diagnostics Enable colors in diagnostics
! HELP-NEXT: -fno-color-diagnostics Disable colors in diagnostics
! HELP-NEXT: -help Display available options
+! HELP-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-NEXT: -o <file> Write output to <file>
! HELP-NEXT: -U <macro> Undefine macro <macro>
! HELP-NEXT: --version Print version information
! HELP-FC1-NEXT: -emit-obj Emit native object files
! HELP-FC1-NEXT: -E Only run the preprocessor
! HELP-FC1-NEXT: -help Display available options
+! HELP-FC1-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-FC1-NEXT: -o <file> Write output to <file>
! HELP-FC1-NEXT: -U <macro> Undefine macro <macro>
! HELP-FC1-NEXT: --version Print version information
--- /dev/null
+! Ensure argument -I works as expected with an included header.
+
+! REQUIRES: new-flang-driver
+
+!--------------------------
+! FLANG DRIVER (flang-new)
+!--------------------------
+! RUN: not %flang-new -E %s 2>&1 | FileCheck %s --check-prefix=UNINCLUDED
+! RUN: %flang-new -E -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SINGLEINCLUDE
+! RUN: %flang-new -E -I %S/Inputs -I %S/Inputs/header-dir %s 2>&1 | FileCheck %s --check-prefix=MAINDIRECTORY
+! RUN: %flang-new -E -I %S/Inputs/header-dir -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SUBDIRECTORY
+
+!----------------------------------------
+! FRONTEND FLANG DRIVER (flang-new -fc1)
+!----------------------------------------
+! RUN: not %flang-new -fc1 -E %s 2>&1 | FileCheck %s --check-prefix=UNINCLUDED
+! RUN: %flang-new -fc1 -E -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SINGLEINCLUDE
+! RUN: %flang-new -fc1 -E -I %S/Inputs -I %S/Inputs/header-dir %s 2>&1 | FileCheck %s --check-prefix=MAINDIRECTORY
+! RUN: %flang-new -fc1 -E -I %S/Inputs/header-dir -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SUBDIRECTORY
+
+!--------------------------------------------
+! EXPECTED OUTPUT FOR MISSING INCLUDED FILE
+!--------------------------------------------
+! UNINCLUDED:No such file or directory
+! UNINCLUDED-NOT:program b
+! UNINCLUDED-NOT:program c
+
+!---------------------------------------------
+! EXPECTED OUTPUT FOR A SINGLE INCLUDED FOLDER
+!--------------------------------------------
+! SINGLEINCLUDE:program maindirectoryone
+! SINGLEINCLUDE-NOT:program x
+! SINGLEINCLUDE-NOT:program b
+! SINGLEINCLUDE-NEXT:end
+! SINGLEINCLUDE-NEXT:program maindirectorytwo
+! SINGLEINCLUDE-NOT:program y
+! SINGLEINCLUDE-NOT:program c
+
+!-------------------------------------------------------
+! EXPECTED OUTPUT FOR Inputs/ DIRECTORY SPECIFIED FIRST
+!-------------------------------------------------------
+! MAINDIRECTORY:program maindirectoryone
+! MAINDIRECTORY-NOT:program subdirectoryone
+! MAINDIRECTORY-NOT:program b
+! MAINDIRECTORY-NEXT:end
+! MAINDIRECTORY-NEXT:program maindirectorytwo
+! MAINDIRECTORY-NOT:program subdirectorytwo
+! MAINDIRECTORY-NOT:program c
+
+!------------------------------------------------------------------
+! EXPECTED OUTPUT FOR Inputs/header-dir/ DIRECTORY SPECIFIED FIRST
+!------------------------------------------------------------------
+! SUBDIRECTORY:program subdirectoryone
+! SUBDIRECTORY-NOT:program maindirectoryone
+! SUBDIRECTORY-NOT:program b
+! SUBDIRECTORY-NEXT:end
+! SUBDIRECTORY-NEXT:program subdirectorytwo
+! SUBDIRECTORY-NOT:program maindirectorytwo
+! SUBDIRECTORY-NOT:program c
+
+! include-test-one.f90
+#include <basic-header-one.h>
+#ifdef X
+program X
+#else
+program B
+#endif
+end
+
+! include-test-two.f90
+INCLUDE "basic-header-two.h"
+#ifdef Y
+program Y
+#else
+program C
+#endif
+end
--- /dev/null
+! Ensure argument -I works as expected with module files.
+! The module files for this test are not real module files.
+
+! REQUIRES: new-flang-driver
+
+!--------------------------
+! FLANG DRIVER (flang-new)
+!--------------------------
+! RUN: not %flang-new -fsyntax-only -I %S/Inputs -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED
+! RUN: not %flang-new -fsyntax-only -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SINGLEINCLUDE
+
+!-----------------------------------------
+! FRONTEND FLANG DRIVER (flang-new -fc1)
+!-----------------------------------------
+! RUN: not %flang-new -fc1 -fsyntax-only -I %S/Inputs -I %S/Inputs/module-dir %s 2>&1 | FileCheck %s --check-prefix=INCLUDED
+! RUN: not %flang-new -fc1 -fsyntax-only -I %S/Inputs %s 2>&1 | FileCheck %s --check-prefix=SINGLEINCLUDE
+
+!-----------------------------------------
+! EXPECTED OUTPUT FOR MISSING MODULE FILE
+!-----------------------------------------
+! SINGLEINCLUDE:No such file or directory
+! SINGLEINCLUDE-NOT:Error reading module file for module 'basictestmoduletwo'
+
+!---------------------------------------
+! EXPECTED OUTPUT FOR ALL MODULES FOUND
+!---------------------------------------
+! INCLUDED-NOT:No such file or directory
+
+program test_dash_I_with_mod_files
+ USE basictestmoduleone
+ USE basictestmoduletwo
+end