This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Fortran, Patch] Fix CPP <include_path> (PR 37821)


Comitted as Rev. 141544.

Tobias

On Sun, Nov 02, 2008 at 02:28:05PM +0100, Tobias Burnus wrote:
> Hi all,
> 
> an updated patch for include; since libcpp automatically
> handles the path for #include "...", I simplified
> gfc_cpp_add_include_path
> 
> The #include "..." path is handled as gcc does; this is
> now also what happens for INCLUDE.
> 
> Additionally, I added "-fno-range-error" to arith_error
> and print the location for the load_file error.
> 
> Build and regression tested on x86-64-linux.
> 
> As Janne pre-approved the patch, I intent to commit this
> patch tomorrow, unless someone objects or OKs it before.
> 
> Tobias
> 
> 
> On Thu, Oct 16, 2008 at 08:52:53PM +0200, Tobias Burnus wrote:
> > Hi all,
> > 
> > attached a revised patch as the previous patch broke "include"
> > ("#include" worked) for ".".
> > 
> > The new patch features:
> > * #include "..." and  include '...' test cases
> > * directories where the source files resist come first
> >   in the include list (both #include "..." and include)
> > * "." is not added for #include "..." as licpp does so
> >   automatically
> > * the location of the sourcefile is not added for
> >   #include <...> but -I dir is also used for <...>
> >   (This was the problem reported in the PR.)
> > * With explicit -cpp the -I dir are only passed once
> >   to f951 (still twice for the implict (.F etc.) cpp
> >   calling).
> > 
> > Bootstrapped and regtested on x86-64-linux
> > 
> > I also did several manual tests (for -cpp the "-v" option
> > shows the search paths). [I would not mind if someone could
> > also playround with include (w/ and w/o -cpp) and with
> > #include "..." and #include <...>. I think everything should
> > work, but I'm not positive.]
> > 
> > OK for the trunk?
> > 
> > Tobias
> > 
> > PS: I have just started wondering whether libcpp automatically
> >   adds "subdir" to the search path for  "gfortran subdir/file.F".
> >   I'm not sure whether I tested this; I think with this
> >   patch the path is added, which might not be needed but it
> >   does not harm (= does what is should and shows no warning
> >   with -v [this is also tested for by the new test case]).

> 2008-11-02  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-02  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.
> 
> Index: gcc/fortran/cpp.c
> ===================================================================
> --- gcc/fortran/cpp.c	(Revision 141531)
> +++ gcc/fortran/cpp.c	(Arbeitskopie)
> @@ -628,10 +628,9 @@ gfc_cpp_add_include_path (char *path, bo
>  {
>    /* 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
> Index: gcc/fortran/gfortran.h
> ===================================================================
> --- gcc/fortran/gfortran.h	(Revision 141531)
> +++ gcc/fortran/gfortran.h	(Arbeitskopie)
> @@ -2093,7 +2093,7 @@ bool gfc_in_match_data (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);
> Index: gcc/fortran/scanner.c
> ===================================================================
> --- gcc/fortran/scanner.c	(Revision 141531)
> +++ gcc/fortran/scanner.c	(Arbeitskopie)
> @@ -307,7 +307,7 @@ gfc_scanner_done_1 (void)
>  
>  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;
> @@ -317,11 +317,15 @@ add_path_to_list (gfc_directorylist **li
>      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;
>  
> @@ -329,7 +333,9 @@ add_path_to_list (gfc_directorylist **li
>        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);
> @@ -338,17 +344,20 @@ add_path_to_list (gfc_directorylist **li
>  
>  
>  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);
>  }
>  
>  
> @@ -1767,7 +1776,9 @@ load_file (const char *realfilename, con
>    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;
>        }
>  
> @@ -1791,7 +1802,8 @@ load_file (const char *realfilename, con
>        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;
>  	}
>      }
> Index: gcc/fortran/lang-specs.h
> ===================================================================
> --- gcc/fortran/lang-specs.h	(Revision 141531)
> +++ gcc/fortran/lang-specs.h	(Arbeitskopie)
> @@ -23,7 +23,7 @@
>  
>  #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}"
> Index: gcc/fortran/arith.c
> ===================================================================
> --- gcc/fortran/arith.c	(Revision 141531)
> +++ gcc/fortran/arith.c	(Arbeitskopie)
> @@ -2065,11 +2065,13 @@ arith_error (arith rc, gfc_typespec *fro
>  		 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:
> Index: gcc/fortran/options.c
> ===================================================================
> --- gcc/fortran/options.c	(Revision 141531)
> +++ gcc/fortran/options.c	(Arbeitskopie)
> @@ -265,10 +265,10 @@ gfc_post_options (const char **pfilename
>        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));
> @@ -407,7 +407,7 @@ gfc_handle_module_path_options (const ch
>    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);
>  }
>  
>  
> @@ -639,7 +639,7 @@ gfc_handle_option (size_t scode, const c
>        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;
>  
> @@ -744,7 +744,7 @@ gfc_handle_option (size_t scode, const c
>        break;
>  
>      case OPT_I:
> -      gfc_add_include_path (arg, true);
> +      gfc_add_include_path (arg, true, false);
>        break;
>  
>      case OPT_J:
> Index: gcc/testsuite/gfortran.dg/include_4.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/include_4.f90	(Revision 0)
> +++ gcc/testsuite/gfortran.dg/include_4.f90	(Revision 0)
> @@ -0,0 +1,12 @@
> +! { 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
> Index: gcc/testsuite/gfortran.dg/include_4.inc
> ===================================================================
> --- gcc/testsuite/gfortran.dg/include_4.inc	(Revision 0)
> +++ gcc/testsuite/gfortran.dg/include_4.inc	(Revision 0)
> @@ -0,0 +1,4 @@
> +! Used by include_4.f90 and include_5.f90
> +! PR fortran/37821
> +!
> +integer, parameter :: i4 = 4
> Index: gcc/testsuite/gfortran.dg/include_5.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/include_5.f90	(Revision 0)
> +++ gcc/testsuite/gfortran.dg/include_5.f90	(Revision 0)
> @@ -0,0 +1,18 @@
> +! { 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]