------- Comment #4 from burnus at gcc dot gnu dot org 2009-06-15 12:16 ------- Note: syntax_get_rule_ptr is defined as:
function syntax_get_rule_ptr (syntax, key) result (rule) type(syntax_rule_t), pointer :: rule type(syntax_t), intent(in), target :: syntax type(string_t), intent(in) :: key and "syntax_rule_set_sub" is defined as follows where "sub" is the relevant argument: subroutine syntax_rule_set_sub (rule, i, sub) type(syntax_rule_t), intent(inout) :: rule integer, intent(in) :: i type(syntax_rule_t), intent(in), target :: sub If one looks at the dump for the following line in set_rule_contents call syntax_rule_set_sub (rule, i, syntax_get_rule_ptr (syntax, & lexeme_get_contents (lexeme(i+3)))) one finds: integer(kind=8) S.297; struct varying_string D.6550; D.6550 = lexeme_get_contents (&(*lexeme)[(integer(kind=8)) (i + 3) + -1]); syntax_rule_set_sub ((struct syntax_rule_t *) rule, &i, syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)); which looks OK. But then it continues: if (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->keyword.chars.data != 0B) __builtin_free (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->keyword.chars.data); syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->keyword.chars.data = 0B; if (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->separator.chars.data != 0B) __builtin_free (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->separator.chars.data); syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->separator.chars.data = 0B; S.297 = 0; while (1) { if (S.297 > 1) goto L.27; if (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->delimiter[S.297].chars.data != 0B) __builtin_free (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->delimiter[S.297].chars.data); syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->delimiter[S.297].chars.data = 0B; S.297 = S.297 + 1; } L.27:; if (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->child.data != 0B) __builtin_free (syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->child.data); syntax_get_rule_ptr ((struct syntax_t *) syntax, &D.6550)->child.data = 0B; if (D.6550.chars.data != 0B) __builtin_free (D.6550.chars.data); D.6550.chars.data = 0B; Thus the problem seems to be that "syntax_get_rule_ptr" is treated as variable and not as function call. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40440