From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9438 invoked by alias); 27 Feb 2006 16:10:18 -0000 Received: (qmail 9428 invoked by uid 48); 27 Feb 2006 16:10:16 -0000 Date: Mon, 27 Feb 2006 16:18:00 -0000 Message-ID: <20060227161016.9427.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug fortran/26393] ICE with function returning variable lenght array In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "paul dot richard dot thomas at cea dot fr" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2006-02/txt/msg03060.txt.bz2 List-Id: ------- Comment #3 from paul dot richard dot thomas at cea dot fr 2006-02-27 16:10 ------- I have a fix that I will post tonight but it appears below anyway. Paul Index: gcc/fortran/trans-decl.c =================================================================== --- gcc/fortran/trans-decl.c (r├®vision 111471) +++ gcc/fortran/trans-decl.c (copie de travail) @@ -846,7 +846,8 @@ tree length = NULL_TREE; int byref; - gcc_assert (sym->attr.referenced); + gcc_assert (sym->attr.referenced + || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY); if (sym->ns && sym->ns->proc_name->attr.function) byref = gfc_return_by_reference (sym->ns->proc_name); and the testcase ! { dg-do run } ! Tests the fix for PR26393, in which an ICE would occur in trans-decl.c ! (gfc_get_symbol_decl) because anzKomponenten is not referenced in the ! interface for solveCConvert. The solution was to assert that the symbol ! is either referenced or in an interface body. ! ! Based on the testcase in the PR. ! MODULE MODULE_CONC INTEGER, SAVE :: anzKomponenten = 2 END MODULE MODULE_CONC MODULE MODULE_THERMOCALC INTERFACE FUNCTION solveCConvert () USE MODULE_CONC, ONLY: anzKomponenten REAL :: solveCConvert(1:anzKomponenten) END FUNCTION solveCConvert END INTERFACE END MODULE MODULE_THERMOCALC SUBROUTINE outDiffKoeff USE MODULE_CONC USE MODULE_THERMOCALC REAL :: buffer_conc(1:anzKomponenten) buffer_conc = solveCConvert () if (any(buffer_conc .ne. (/(real(i), i = 1, anzKomponenten)/))) & call abort () END SUBROUTINE outDiffKoeff program missing_ref USE MODULE_CONC call outDiffKoeff ! Now set anzKomponenten to a value that would cause a segfault if ! buffer_conc and solveCConvert did not have the correct allocation ! of memory. anzKomponenten = 5000 call outDiffKoeff end program missing_ref FUNCTION solveCConvert () USE MODULE_CONC, ONLY: anzKomponenten REAL :: solveCConvert(1:anzKomponenten) solveCConvert = (/(real(i), i = 1, anzKomponenten)/) END FUNCTION solveCConvert -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26393