Commit 6690a9e0 by Paul Thomas

re PR fortran/14067 (no warning when character data statement overflows declared size)

2006-06-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/14067
	* data.c (create_character_intializer): Add warning message
	for truncated string.

	PR fortran/16943
	* symbol.c : Include flags.h.
	(gfc_add_type): If a procedure and types are the same do not
	throw an error unless standard is less than gnu or pedantic.

	PR fortran/20838
	* parse.c (parse_do_block): Error if named block do construct
	does not have a named enddo.

	PR fortran/27655
	* check.c (gfc_check_associated): Pick up EXPR_NULL for pointer
	as well as target and put error return at end of function.

2006-06-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/14067
	* gfortran.dg/data_char_1.f90: Add messages for truncated
	strings.

	PR fortran/16943
	* gfortran.dg/func_decl_2.f90: New test.

	PR fortran/20838
	* gfortran.dg/do_2.f90: New test.

	PR fortran/27655
	* gfortran.dg/associated_3.f90: New test.

From-SVN: r114385
parent 86ad0dd6
2006-06-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/14067
* data.c (create_character_intializer): Add warning message
for truncated string.
PR fortran/16943
* symbol.c : Include flags.h.
(gfc_add_type): If a procedure and types are the same do not
throw an error unless standard is less than gnu or pedantic.
PR fortran/20838
* parse.c (parse_do_block): Error if named block do construct
does not have a named enddo.
PR fortran/27655
* check.c (gfc_check_associated): Pick up EXPR_NULL for pointer
as well as target and put error return at end of function.
2006-06-03 Francois-Xavier Coudert <coudert@clipper.ens.fr> 2006-06-03 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* trans.c (gfc_msg_bounds, gfc_msg_fault, gfc_msg_wrong_return): * trans.c (gfc_msg_bounds, gfc_msg_fault, gfc_msg_wrong_return):
......
...@@ -499,11 +499,16 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target) ...@@ -499,11 +499,16 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target)
symbol_attribute attr; symbol_attribute attr;
int i; int i;
try t; try t;
locus *where;
where = &pointer->where;
if (pointer->expr_type == EXPR_VARIABLE) if (pointer->expr_type == EXPR_VARIABLE)
attr = gfc_variable_attr (pointer, NULL); attr = gfc_variable_attr (pointer, NULL);
else if (pointer->expr_type == EXPR_FUNCTION) else if (pointer->expr_type == EXPR_FUNCTION)
attr = pointer->symtree->n.sym->attr; attr = pointer->symtree->n.sym->attr;
else if (pointer->expr_type == EXPR_NULL)
goto null_arg;
else else
gcc_assert (0); /* Pointer must be a variable or a function. */ gcc_assert (0); /* Pointer must be a variable or a function. */
...@@ -519,13 +524,9 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target) ...@@ -519,13 +524,9 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target)
if (target == NULL) if (target == NULL)
return SUCCESS; return SUCCESS;
where = &target->where;
if (target->expr_type == EXPR_NULL) if (target->expr_type == EXPR_NULL)
{ goto null_arg;
gfc_error ("NULL pointer at %L is not permitted as actual argument "
"of '%s' intrinsic function",
&target->where, gfc_current_intrinsic);
return FAILURE;
}
if (target->expr_type == EXPR_VARIABLE) if (target->expr_type == EXPR_VARIABLE)
attr = gfc_variable_attr (target, NULL); attr = gfc_variable_attr (target, NULL);
...@@ -565,6 +566,13 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target) ...@@ -565,6 +566,13 @@ gfc_check_associated (gfc_expr * pointer, gfc_expr * target)
} }
} }
return t; return t;
null_arg:
gfc_error ("NULL pointer at %L is not permitted as actual argument "
"of '%s' intrinsic function", where, gfc_current_intrinsic);
return FAILURE;
} }
......
...@@ -185,7 +185,12 @@ create_character_intializer (gfc_expr * init, gfc_typespec * ts, ...@@ -185,7 +185,12 @@ create_character_intializer (gfc_expr * init, gfc_typespec * ts,
/* Copy the initial value. */ /* Copy the initial value. */
len = rvalue->value.character.length; len = rvalue->value.character.length;
if (len > end - start) if (len > end - start)
len = end - start; {
len = end - start;
gfc_warning_now ("initialization string truncated to match variable "
"at %L", &rvalue->where);
}
memcpy (&dest[start], rvalue->value.character.string, len); memcpy (&dest[start], rvalue->value.character.string, len);
/* Pad with spaces. Substrings will already be blanked. */ /* Pad with spaces. Substrings will already be blanked. */
......
...@@ -2282,6 +2282,15 @@ loop: ...@@ -2282,6 +2282,15 @@ loop:
break; break;
case ST_IMPLIED_ENDDO: case ST_IMPLIED_ENDDO:
/* If the do-stmt of this DO construct has a do-construct-name,
the corresponding end-do must be an end-do-stmt (with a matching
name, but in that case we must have seen ST_ENDDO first).
We only complain about this in pedantic mode. */
if (gfc_current_block () != NULL)
gfc_error_now
("named block DO at %L requires matching ENDDO name",
&gfc_current_block()->declared_at);
break; break;
default: default:
......
...@@ -23,6 +23,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -23,6 +23,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "flags.h"
#include "gfortran.h" #include "gfortran.h"
#include "parse.h" #include "parse.h"
...@@ -1178,9 +1179,18 @@ gfc_add_type (gfc_symbol * sym, gfc_typespec * ts, locus * where) ...@@ -1178,9 +1179,18 @@ gfc_add_type (gfc_symbol * sym, gfc_typespec * ts, locus * where)
if (sym->ts.type != BT_UNKNOWN) if (sym->ts.type != BT_UNKNOWN)
{ {
gfc_error ("Symbol '%s' at %L already has basic type of %s", sym->name, const char *msg = "Symbol '%s' at %L already has basic type of %s";
where, gfc_basic_typename (sym->ts.type)); if (!(sym->ts.type == ts->type
return FAILURE; && (sym->attr.flavor == FL_PROCEDURE || sym->attr.result))
|| gfc_notification_std (GFC_STD_GNU) == ERROR
|| pedantic)
{
gfc_error (msg, sym->name, where, gfc_basic_typename (sym->ts.type));
return FAILURE;
}
else if (gfc_notify_std (GFC_STD_GNU, msg, sym->name, where,
gfc_basic_typename (sym->ts.type)) == FAILURE)
return FAILURE;
} }
flavor = sym->attr.flavor; flavor = sym->attr.flavor;
......
2006-06-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/14067
* gfortran.dg/data_char_1.f90: Add messages for truncated
strings.
PR fortran/16943
* gfortran.dg/func_decl_2.f90: New test.
PR fortran/20838
* gfortran.dg/do_2.f90: New test.
PR fortran/27655
* gfortran.dg/associated_3.f90: New test.
2006-06-04 Mark Mitchell <mark@codesourcery.com> 2006-06-04 Mark Mitchell <mark@codesourcery.com>
PR c++/27819 PR c++/27819
! { dg-do compile }
! Test for fix of PR27655
!
!Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
integer, pointer :: i
print *, associated(NULL(),i) ! { dg-error "not permitted as actual argument" }
print *, associated(i,NULL()) ! { dg-error "not permitted as actual argument" }
end
! { dg-do run } ! { dg-do run }
! Test character variables in data statements ! Test character variables in data statements
! Also substrings of cahracter variables. ! Also substrings of character variables.
! PR14976 PR16228 ! PR14976 PR16228
program data_char_1 program data_char_1
character(len=5) :: a(2) character(len=5) :: a(2)
character(len=5) :: b(2) character(len=5) :: b(2)
data a /'Hellow', 'orld'/ data a /'Hellow', 'orld'/ ! { dg-warning "string truncated" }
data b(:)(1:4), b(1)(5:5), b(2)(5:5) /'abcdefg', 'hi', 'j', 'k'/ data b(:)(1:4), b(1)(5:5), b(2)(5:5) &
/'abcdefg', 'hi', 'j', 'k'/ ! { dg-warning "string truncated" }
if ((a(1) .ne. 'Hello') .or. (a(2) .ne. 'orld ')) call abort if ((a(1) .ne. 'Hello') .or. (a(2) .ne. 'orld ')) call abort
if ((b(1) .ne. 'abcdj') .or. (b(2) .ne. 'hi k')) call abort if ((b(1) .ne. 'abcdj') .or. (b(2) .ne. 'hi k')) call abort
......
! { dg-do compile }
! Check the fix for PR20839, which concerned non-compliance with one of the
! constraints for block-do-constructs (8.1.4.1.1):
! Constraint: If the do-stmt of a block-do-construct is identified by a
! do-construct-name, the corresponding end-do shall be an end-do-stmt
! specifying the same do-construct-name. (Tests a & b)
! If the do-stmt of a block-do-construct is not identified by a
! do-construct-name, the corresponding end-do shall not specify a
! do-construct-name. (Tests c & d)
! Constraint: If the do-stmt is a nonlabel-do-stmt, the corresponding end-do
! shall be an end-do-stmt.
! Constraint: If the do-stmt is a label-do-stmt, the corresponding end-do shall
! be identified with the same label.
!
! Test a - this was the PR
doi: DO 111 i=1,3 ! { dg-error "requires matching ENDDO name" }
111 continue
! Test b
doii: DO 112 ij=1,3
112 enddo doij ! { dg-error "Expected label" }
! Test c
DO 113 ik=1,3
113 enddo doik ! { dg-error "Syntax error" }
! Test d
DO il=1,3
enddo doil ! { dg-error "Syntax error" }
! Test e
doj: DO 114 j=1,3
enddo doj ! { dg-error "doesn't match DO label" }
! Correct block do constructs
dok: DO 115 k=1,3
dokk: do kk=1,3
dokkk: DO
do kkkk=1,3
do
enddo
enddo
enddo dokkk
enddo dokk
115 enddo dok
! Correct non-block do constructs
do 117 l=1,3
do ll=1,3
do 116 lll=1,3
116 continue
enddo
117 enddo
! These prevent an EOF error, arising from the previous errors.
end do
113 end do
112 end do doii
END
! { dg-do compile }
! Test fix for PR16943 in which the double typing of
! N caused an error. This is a common extension to the
! F95 standard, so the error is only thrown for -std=f95
! or -pedantic.
!
! Contributed by Paul Thomas <pault@gcc.gnu.org>
!
program bug8
implicit none
stop " OK. "
contains
integer function bugf(M) result (N)
integer, intent (in) :: M
integer :: N ! { dg-warning "already has basic type of INTEGER" }
N = M
return
end function bugf
end program bug8
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment