diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 5 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 10 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/c_ptr_tests_13.f03 | 15 |
6 files changed, 48 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d9885ae..7b05fb5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2007-10-17 Christopher D. Rickett <crickett@lanl.gov> + + PR fortran/33760 + * symbol.c (gen_special_c_interop_ptr): Remove code to create + constructor for c_null_ptr and c_null_funptr with value of 0. + * expr.c (check_init_expr): Prevent check on constructors for + iso_c_binding derived types. + * resolve.c (resolve_structure_cons): Verify that the user isn't + trying to invoke a structure constructor for one of the + iso_c_binding derived types. + 2007-10-15 Christopher D. Rickett <crickett@lanl.gov> PR fortran/32600 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 447263a..2edf7ad 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2249,7 +2249,10 @@ check_init_expr (gfc_expr *e) break; case EXPR_STRUCTURE: - t = gfc_check_constructor (e, check_init_expr); + if (e->ts.is_iso_c) + t = SUCCESS; + else + t = gfc_check_constructor (e, check_init_expr); break; case EXPR_ARRAY: diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 65e479f..f16fe28 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -728,6 +728,16 @@ resolve_structure_cons (gfc_expr *expr) else comp = expr->ts.derived->components; + /* See if the user is trying to invoke a structure constructor for one of + the iso_c_binding derived types. */ + if (expr->ts.derived && expr->ts.derived->ts.is_iso_c && cons + && cons->expr != NULL) + { + gfc_error ("Components of structure constructor '%s' at %L are PRIVATE", + expr->ts.derived->name, &(expr->where)); + return FAILURE; + } + for (; comp; comp = comp->next, cons = cons->next) { if (!cons->expr) diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index ae97a65..b0c2825 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -3354,10 +3354,10 @@ gen_special_c_interop_ptr (int ptr_id, const char *ptr_name, tmp_sym->value->expr_type = EXPR_STRUCTURE; tmp_sym->value->ts.type = BT_DERIVED; tmp_sym->value->ts.derived = tmp_sym->ts.derived; + /* Create a constructor with no expr, that way we can recognize if the user + tries to call the structure constructor for one of the iso_c_binding + derived types during resolution (resolve_structure_cons). */ tmp_sym->value->value.constructor = gfc_get_constructor (); - /* This line will initialize the c_null_ptr/c_null_funptr - c_address field to NULL. */ - tmp_sym->value->value.constructor->expr = gfc_int_expr (0); /* Must declare c_null_ptr and c_null_funptr as having the PARAMETER attribute so they can be used in init expressions. */ tmp_sym->attr.flavor = FL_PARAMETER; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 35adc95..32e22f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-17 Christopher D. Rickett <crickett@lanl.gov> + + PR fortran/33760 + * gfortran.dg/c_ptr_tests_13.f03: New test case. + 2007-10-16 Paolo Carlini <pcarlini@suse.de> PR c++/28639 diff --git a/gcc/testsuite/gfortran.dg/c_ptr_tests_13.f03 b/gcc/testsuite/gfortran.dg/c_ptr_tests_13.f03 new file mode 100644 index 0000000..c7a603b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/c_ptr_tests_13.f03 @@ -0,0 +1,15 @@ +! { dg-do compile } +! Ensure that the user cannot call the structure constructor for one of +! the iso_c_binding derived types. +! +! PR fortran/33760 +! +program main + use ISO_C_BINDING + implicit none + integer(C_INTPTR_T) p + type(C_PTR) cptr + p = 0 + cptr = C_PTR(p+1) ! { dg-error "Components of structure constructor" } + cptr = C_PTR(1) ! { dg-error "Components of structure constructor" } +end program main |