mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR fortran/78021 (Wrong result with optimization on character constant)
2016-10-22 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/78021 * gfc_compare_functions: Strings with different lengths in argument lists compare unequal. 2016-10-22 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/78021 * gfortran.dg/string_length_3.f90: New test. From-SVN: r241440
This commit is contained in:
		
							parent
							
								
									574284e9c4
								
							
						
					
					
						commit
						15876ceeb1
					
				|  | @ -1,3 +1,9 @@ | |||
| 2016-10-22  Thomas Koenig  <tkoenig@gcc.gnu.org> | ||||
| 
 | ||||
| 	PR fortran/78021 | ||||
| 	* gfc_compare_functions:  Strings with different lengths in | ||||
| 	argument lists compare unequal. | ||||
| 
 | ||||
| 2016-10-22  Andre Vehreschild  <vehre@gcc.gnu.org> | ||||
| 
 | ||||
| 	PR fortran/43366 | ||||
|  |  | |||
|  | @ -226,9 +226,26 @@ gfc_dep_compare_functions (gfc_expr *e1, gfc_expr *e2, bool impure_ok) | |||
| 	  if ((args1->expr == NULL) ^ (args2->expr == NULL)) | ||||
| 	    return -2; | ||||
| 
 | ||||
| 	  if (args1->expr != NULL && args2->expr != NULL | ||||
| 	      && gfc_dep_compare_expr (args1->expr, args2->expr) != 0) | ||||
| 	    return -2; | ||||
| 	  if (args1->expr != NULL && args2->expr != NULL) | ||||
| 	    { | ||||
| 	      gfc_expr *e1, *e2; | ||||
| 	      e1 = args1->expr; | ||||
| 	      e2 = args2->expr; | ||||
| 
 | ||||
| 	      if (gfc_dep_compare_expr (e1, e2) != 0) | ||||
| 		return -2; | ||||
| 
 | ||||
| 	      /* Special case: String arguments which compare equal can have
 | ||||
| 		 different lengths, which makes them different in calls to | ||||
| 		 procedures.  */ | ||||
| 	       | ||||
| 	      if (e1->expr_type == EXPR_CONSTANT | ||||
| 		  && e1->ts.type == BT_CHARACTER | ||||
| 		  && e2->expr_type == EXPR_CONSTANT | ||||
| 		  && e2->ts.type == BT_CHARACTER | ||||
| 		  && e1->value.character.length != e2->value.character.length) | ||||
| 		return -2; | ||||
| 	    } | ||||
| 
 | ||||
| 	  args1 = args1->next; | ||||
| 	  args2 = args2->next; | ||||
|  |  | |||
|  | @ -1,3 +1,8 @@ | |||
| 2016-10-22  Thomas Koenig  <tkoenig@gcc.gnu.org> | ||||
| 
 | ||||
| 	PR fortran/78021 | ||||
| 	* gfortran.dg/string_length_3.f90:  New test. | ||||
| 
 | ||||
| 2016-10-22  Andre Vehreschild  <vehre@gcc.gnu.org> | ||||
| 
 | ||||
| 	Forgot to add on original commit. | ||||
|  |  | |||
|  | @ -0,0 +1,19 @@ | |||
| ! { dg-do run } | ||||
| ! { dg-options "-ffrontend-optimize -fdump-tree-original" } | ||||
| ! PR 78021 - calls to mylen were folded after shortening the | ||||
| ! argument list. | ||||
| 
 | ||||
| PROGRAM test_o_char | ||||
|   implicit none | ||||
|   integer :: n | ||||
|   n = mylen('c') + mylen('c   ') | ||||
|   if (n /= 5) call abort | ||||
| CONTAINS | ||||
| 
 | ||||
|   FUNCTION mylen(c) | ||||
|     CHARACTER(len=*),INTENT(in) :: c | ||||
|     INTEGER :: mylen | ||||
|     mylen=LEN(c) | ||||
|   END FUNCTION mylen | ||||
| END PROGRAM test_o_char | ||||
| ! { dg-final { scan-tree-dump-times "__var" 0 "original" } } | ||||
		Loading…
	
		Reference in New Issue
	
	 Thomas Koenig
						Thomas Koenig