Bug 27996 - [4.1 only] Compile time warn for: character(2) :: str = 'ABC' (expression truncated)
Summary: [4.1 only] Compile time warn for: character(2) :: str = 'ABC' (expression tr...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: unknown
: P3 normal
Target Milestone: ---
Assignee: Paul Thomas
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2006-06-12 10:03 UTC by tobias.burnus
Modified: 2007-01-14 14:52 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2006-06-13 17:24:13


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description tobias.burnus 2006-06-12 10:03:24 UTC
In the following, the assignment to str gets truncated twice.
gfortran -Wall does not give any warning.

Expected: As similar warning as NAG gives:
  Warning: trunc.f90, line 2: Initialisation expression for STR truncated
At least the first initalization should be detected, possibly also the second.
Such error messaging works for real, dimension(3) :: [1.0, 2.0, 3.0] at both places:
  Error: different shape for Array assignment at (1) on dimension 1 (2/3)

---------------
program test
  character(2) :: c = 'AAA'
  c = 'ABC'
  print *, c
end program test
---------------
Comment 1 tobias.burnus 2006-06-23 13:01:04 UTC
Additional remarks (which I forget to make):

Both cases are valid Fortran as:

(1) If the length of 'variable' is less than that of 'expr', the value of
'expr' is truncated from the right until it is the same length as the
'variable'.

(2) If the length of 'variable' is greater than that of 'expr', the value of
'expr' is extended on the right with blanks until it is the same length as
the variable.

However, I still think it is useful to give a compile-time warning. This for example should produce a warning:
----------------------------------------
program test
  character(20),parameter :: path = 'mypath/'
  character(20),parameter :: file = path // 'myfile.txt'
  print *, trim(file)
end program test
----------------------------------------
whereas using "trim(path) // 'myfile.txt'" should not.
Comment 2 patchapp@dberlin.org 2006-11-29 20:00:43 UTC
Subject: Bug number PR27996

A patch for this bug has been added to the patch tracker.
The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01989.html
Comment 3 Paul Thomas 2007-01-05 14:45:46 UTC
Subject: Bug 27996

Author: pault
Date: Fri Jan  5 14:45:20 2007
New Revision: 120485

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=120485
Log:
2007-01-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/23232
	* decl.c (gfc_in_match_data, gfc_set_in_match_data): New
	functions to signal that a DATA statement is being matched.
	(gfc_match_data): Call gfc_set_in_match_data on entry and on
	exit.
	* gfortran.h : Add prototypes for above.
	* expr.c (check_init_expr): Avoid check on parameter or
	variable if gfc_in_match_data is true.
	(gfc_match_init_expr): Do not call error on non-reduction of
	expression if gfc_in_match_data is true.

	PR fortran/27996
	PR fortran/27998
	* decl.c (gfc_set_constant_character_len): Add boolean arg to
	flag array constructor resolution.  Warn if string is being
	truncated.  Standard dependent error if string is padded. Set
	new arg to false for all three calls to
	gfc_set_constant_character_len.
	* match.h : Add boolean arg to prototype for
	gfc_set_constant_character_len.
	* gfortran.h : Add warn_character_truncation to gfc_options.
	* options.c (set_Wall): Set warn_character_truncation if -Wall
	is set.
	* resolve.c (resolve_code): Warn if rhs string in character
	assignment has to be truncated.
	* array.c (gfc_resolve_character_array_constructor): Set new
	argument to true for call to gfc_set_constant_character_len.

2007-01-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/23232
	* gfortran.dg/data_implied_do_1.f90: New test.

	PR fortran/27996
	PR fortran/27998
	* gfortran.dg/char_length_1.f90: New test.



Added:
    trunk/gcc/testsuite/gfortran.dg/data_implied_do_1.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/array.c
    trunk/gcc/fortran/decl.c
    trunk/gcc/fortran/expr.c
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/match.h
    trunk/gcc/fortran/options.c
    trunk/gcc/fortran/resolve.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/char_length_1.f90

Comment 4 Paul Thomas 2007-01-14 14:50:17 UTC
Subject: Bug 27996

Author: pault
Date: Sun Jan 14 14:49:50 2007
New Revision: 120772

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=120772
Log:
2007-01-14  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
	    Paul Thomas  <pault@gcc.gnu.org>

	Back port from trunk

	PR fortran/30408
	* lang.opt: Add Wcharacter_truncation option.
	* options.c (gfc_init_options): Initialize
	gfc_option.warn_character_truncation to zero.
	(gfc_handle_option): Add case for OPT_Wcharacter_truncation.

	PR fortran/30408
	* resolve.c (resolve_code): Use the code->expr character length
	directly to set length of llen.

2007-01-14  Paul Thomas  <pault@gcc.gnu.org>

	Backports from trunk

	PR fortran/23232
	* decl.c (gfc_in_match_data, gfc_set_in_match_data): New
	functions to signal that a DATA statement is being matched.
	(gfc_match_data): Call gfc_set_in_match_data on entry and on
	exit.
	* gfortran.h : Add prototypes for above.
	* expr.c (check_init_expr): Avoid check on parameter or
	variable if gfc_in_match_data is true.
	(gfc_match_init_expr): Do not call error on non-reduction of
	expression if gfc_in_match_data is true.

	PR fortran/27996
	PR fortran/27998
	* decl.c (gfc_set_constant_character_len): Add boolean arg to
	flag array constructor resolution.  Warn if string is being
	truncated.  Standard dependent error if string is padded. Set
	new arg to false for all three calls to
	gfc_set_constant_character_len.
	* match.h : Add boolean arg to prototype for
	gfc_set_constant_character_len.
	* gfortran.h : Add warn_character_truncation to gfc_options.
	* options.c (set_Wall): Set warn_character_truncation if -Wall
	is set.
	* resolve.c (resolve_code): Warn if rhs string in character
	assignment has to be truncated.
	* array.c (gfc_resolve_character_array_constructor): Set new
	argument to true for call to gfc_set_constant_character_len.

	PR fortran/30410
	* trans-decl.c (gfc_sym_mangled_function_id): Module, external
	symbols must not have the module name prepended.

2007-01-14  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/23232
	* gfortran.dg/data_implied_do_1.f90: New test.

	PR fortran/27996
	PR fortran/27998
	* gfortran.dg/char_length_1.f90: New test.

	PR fortran/30410
	* gfortran.dg/external_procedures_2.f90: New test.

Added:
    branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/char_length_1.f90
    branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/data_implied_do_1.f90
    branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/external_procedures_2.f90
Modified:
    branches/gcc-4_2-branch/gcc/fortran/ChangeLog
    branches/gcc-4_2-branch/gcc/fortran/array.c
    branches/gcc-4_2-branch/gcc/fortran/decl.c
    branches/gcc-4_2-branch/gcc/fortran/expr.c
    branches/gcc-4_2-branch/gcc/fortran/gfortran.h
    branches/gcc-4_2-branch/gcc/fortran/lang.opt
    branches/gcc-4_2-branch/gcc/fortran/match.h
    branches/gcc-4_2-branch/gcc/fortran/options.c
    branches/gcc-4_2-branch/gcc/fortran/resolve.c
    branches/gcc-4_2-branch/gcc/fortran/trans-decl.c
    branches/gcc-4_2-branch/gcc/testsuite/ChangeLog

Comment 5 Paul Thomas 2007-01-14 14:52:18 UTC
Fixed on trunk and 4.2

Paul