diff options
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 5ed838856a9..2e6e98a1ada 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1,5 +1,6 @@ /* Declaration statement matcher - Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 + Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, + 2012, 2013 Free Software Foundation, Inc. Contributed by Andy Vaught @@ -1671,11 +1672,31 @@ match gfc_match_null (gfc_expr **result) { gfc_symbol *sym; - match m; + match m, m2 = MATCH_NO; - m = gfc_match (" null ( )"); - if (m != MATCH_YES) - return m; + if ((m = gfc_match (" null ( )")) == MATCH_ERROR) + return MATCH_ERROR; + + if (m == MATCH_NO) + { + locus old_loc; + char name[GFC_MAX_SYMBOL_LEN + 1]; + + if ((m2 = gfc_match (" null (")) != MATCH_YES) + return m2; + + old_loc = gfc_current_locus; + if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR) + return MATCH_ERROR; + if (m2 != MATCH_YES + && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR)) + return MATCH_ERROR; + if (m2 == MATCH_NO) + { + gfc_current_locus = old_loc; + return MATCH_NO; + } + } /* The NULL symbol now has to be/become an intrinsic function. */ if (gfc_get_symbol ("null", NULL, &sym)) @@ -1694,6 +1715,13 @@ gfc_match_null (gfc_expr **result) *result = gfc_get_null_expr (&gfc_current_locus); + /* Invalid per F2008, C512. */ + if (m2 == MATCH_YES) + { + gfc_error ("NULL() initialization at %C may not have MOLD"); + return MATCH_ERROR; + } + return MATCH_YES; } |