+2008-11-03 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/37821
+ * cpp.c (gfc_cpp_add_include_path): Use BRACKET.
+ * scanner.c (add_path_to_list): Argument to add at head.
+ (gfc_add_include_path): Add new argument.
+ (gfc_add_intrinsic_modules_path) Update call.
+ (load_file): Print filename/line in the error message.
+ * gfortran.h (gfc_add_include_path): Update prototype.
+ * options.c (gfc_post_options,gfc_handle_module_path_options,
+ gfc_handle_option): Update call.
+ * lang-spec.h (F951_OPTIONS): Don't insert include path twice.
+
+ * arith.c (arith_error): Add -fno-range-error to the message.
+
2008-11-03 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37445
gfc_typename (from), gfc_typename (to), where);
break;
case ARITH_UNDERFLOW:
- gfc_error ("Arithmetic underflow converting %s to %s at %L",
+ gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
+ "can be disabled with the option -fno-range-check",
gfc_typename (from), gfc_typename (to), where);
break;
case ARITH_NAN:
- gfc_error ("Arithmetic NaN converting %s to %s at %L",
+ gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
+ "can be disabled with the option -fno-range-check",
gfc_typename (from), gfc_typename (to), where);
break;
case ARITH_DIV0:
{
/* CHAIN sets cpp_dir->sysp which differs from 0 if PATH is a system
include path. Fortran does not define any system include paths. */
- int chain = 0;
int cxx_aware = 0;
- add_path (path, chain, cxx_aware, user_supplied);
+ add_path (path, BRACKET, cxx_aware, user_supplied);
}
void
void gfc_scanner_done_1 (void);
void gfc_scanner_init_1 (void);
-void gfc_add_include_path (const char *, bool);
+void gfc_add_include_path (const char *, bool, bool);
void gfc_add_intrinsic_modules_path (const char *);
void gfc_release_include_path (void);
FILE *gfc_open_included_file (const char *, bool, bool);
#define F951_CPP_OPTIONS "%{!nocpp: -cpp %g.f90 %(cpp_options)\
%{E|M|MM:%(cpp_debug_options) -fsyntax-only} %{E}}"
-#define F951_OPTIONS "%(cc1_options) %{J*} %{I*}\
+#define F951_OPTIONS "%(cc1_options) %{J*} %{!cpp: %{I*}}\
%{!nostdinc:-fintrinsic-modules-path finclude%s}\
%{!fsyntax-only:%(invoke_as)}"
#define F951_SOURCE_FORM "%{!ffree-form:-ffixed-form}"
source_path = (char *) alloca (i + 1);
memcpy (source_path, canon_source_file, i);
source_path[i] = 0;
- gfc_add_include_path (source_path, true);
+ gfc_add_include_path (source_path, true, true);
}
else
- gfc_add_include_path (".", true);
+ gfc_add_include_path (".", true, true);
if (canon_source_file != gfc_source_file)
gfc_free (CONST_CAST (char *, canon_source_file));
strcpy (gfc_option.module_dir, arg);
strcat (gfc_option.module_dir, "/");
- gfc_add_include_path (gfc_option.module_dir, true);
+ gfc_add_include_path (gfc_option.module_dir, true, false);
}
break;
case OPT_fintrinsic_modules_path:
- gfc_add_include_path (arg, false);
+ gfc_add_include_path (arg, false, false);
gfc_add_intrinsic_modules_path (arg);
break;
break;
case OPT_I:
- gfc_add_include_path (arg, true);
+ gfc_add_include_path (arg, true, false);
break;
case OPT_J:
static void
add_path_to_list (gfc_directorylist **list, const char *path,
- bool use_for_modules)
+ bool use_for_modules, bool head)
{
gfc_directorylist *dir;
const char *p;
if (*p++ == '\0')
return;
- dir = *list;
- if (!dir)
- dir = *list = XCNEW (gfc_directorylist);
+ if (head || *list == NULL)
+ {
+ dir = XCNEW (gfc_directorylist);
+ if (!head)
+ *list = dir;
+ }
else
{
+ dir = *list;
while (dir->next)
dir = dir->next;
dir = dir->next;
}
- dir->next = NULL;
+ dir->next = head ? *list : NULL;
+ if (head)
+ *list = dir;
dir->use_for_modules = use_for_modules;
dir->path = XCNEWVEC (char, strlen (p) + 2);
strcpy (dir->path, p);
void
-gfc_add_include_path (const char *path, bool use_for_modules)
+gfc_add_include_path (const char *path, bool use_for_modules, bool file_dir)
{
- add_path_to_list (&include_dirs, path, use_for_modules);
- gfc_cpp_add_include_path (xstrdup(path), true);
+ add_path_to_list (&include_dirs, path, use_for_modules, file_dir);
+
+ /* For '#include "..."' these directories are automatically searched. */
+ if (!file_dir)
+ gfc_cpp_add_include_path (xstrdup(path), true);
}
void
gfc_add_intrinsic_modules_path (const char *path)
{
- add_path_to_list (&intrinsic_modules_dirs, path, true);
+ add_path_to_list (&intrinsic_modules_dirs, path, true, false);
}
for (f = current_file; f; f = f->up)
if (strcmp (filename, f->filename) == 0)
{
- gfc_error_now ("File '%s' is being included recursively", filename);
+ fprintf (stderr, "%s:%d: Error: File '%s' is being included "
+ "recursively\n", current_file->filename, current_file->line,
+ filename);
return FAILURE;
}
input = gfc_open_included_file (realfilename, false, false);
if (input == NULL)
{
- gfc_error_now ("Can't open included file '%s'", filename);
+ fprintf (stderr, "%s:%d: Error: Can't open included file '%s'\n",
+ current_file->filename, current_file->line, filename);
return FAILURE;
}
}
+2008-11-03 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/37821
+ * gfortran.dg/include_4.f90: New.
+ * gfortran.dg/include_5.f90: New.
+ * gfortran.dg/include_4.inc: New.
+
2008-11-03 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37445
--- /dev/null
+! { dg-do compile }
+!
+! PR fortran/37821
+!
+! Ensure that for #include "..." and for include the
+! current directory/directory of the source file is
+! included. See also include_5.f90
+
+subroutine one()
+ include "include_4.inc"
+ integer(i4) :: i
+end subroutine one
--- /dev/null
+! Used by include_4.f90 and include_5.f90
+! PR fortran/37821
+!
+integer, parameter :: i4 = 4
--- /dev/null
+! { dg-do compile }
+! { dg-options "-cpp" }
+!
+! PR fortran/37821
+!
+! Ensure that for #include "..." and for include the
+! current directory/directory of the source file is
+! included.
+
+subroutine one()
+ include "include_4.inc"
+ integer(i4) :: i
+end subroutine one
+
+subroutine two()
+# include "include_4.inc"
+ integer(i4) :: i
+end subroutine two