From 4e104ca305e45835ac3444a0a19e07cf3f8d8a94 Mon Sep 17 00:00:00 2001 From: charlet Date: Wed, 22 Feb 2012 13:47:23 +0000 Subject: [PATCH] 2012-02-22 Ed Schonberg * freeze.adb (Freeze_Entity): Do not perform type layout within a generic unit. 2012-02-22 Eric Botcazou * init.c (__gnat_error_handler) [Linux]: Map SIGBUS to Storage_Error. 2012-02-22 Ed Schonberg * exp_ch5.adb (Expand_N_Assignment_Statement): Reject an assignment to a classwide type whose type is limited, as can happen in an instantiation in programs that run afoul or AI05-0087. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184471 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 18 ++++++++++++++++++ gcc/ada/exp_ch5.adb | 15 ++++++++++++++- gcc/ada/freeze.adb | 8 +++++--- gcc/ada/init.c | 6 +++--- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index be95913..8204c04 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,21 @@ +2012-02-22 Ed Schonberg + + * freeze.adb (Freeze_Entity): Do not perform type layout within + a generic unit. + +2012-02-22 Eric Botcazou + + * init.c (__gnat_error_handler) [Linux]: Map SIGBUS to + Storage_Error. + +2012-02-22 Ed Schonberg + + * exp_ch5.adb (Expand_N_Assignment_Statement): Reject an + assignment to a classwide type whose type is limited, as + can happen in an instantiation in programs that run afoul or + AI05-0087. + + 2012-02-17 Ed Schonberg * exp_ch6.adb (Legal_Copy): If layout is not diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 34ff36a..7eb224d 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -28,6 +28,7 @@ with Atree; use Atree; with Checks; use Checks; with Debug; use Debug; with Einfo; use Einfo; +with Errout; use Errout; with Exp_Aggr; use Exp_Aggr; with Exp_Ch6; use Exp_Ch6; with Exp_Ch7; use Exp_Ch7; @@ -2086,6 +2087,18 @@ package body Exp_Ch5 is and then not Restriction_Active (No_Dispatching_Calls)) then + if Is_Limited_Type (Typ) then + + -- This can happen in an instance when the formal is an + -- extension of a limited interface, and the actual is + -- limited. This is an error according to AI05-0087, but + -- is not caught at the point of instantiation in earlier + -- versions. + + Error_Msg_N ("assignment not available on limited type", N); + return; + end if; + -- Fetch the primitive op _assign and proper type to call it. -- Because of possible conflicts between private and full view, -- fetch the proper type directly from the operation profile. diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 6325b45..15bd6e0 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -4407,10 +4407,12 @@ package body Freeze is -- the size and alignment values. This processing is not required for -- generic types, since generic types do not play any part in code -- generation, and so the size and alignment values for such types - -- are irrelevant. + -- are irrelevant. Ditto for types declared within a generic unit, + -- which may have components that depend on generic parameters, and + -- that will be recreated in an instance. - if Is_Generic_Type (E) then - return Result; + if Inside_A_Generic then + null; -- Otherwise we call the layout procedure diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 79c5c5b..c2fd46b 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2011, Free Software Foundation, Inc. * + * Copyright (C) 1992-2012, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -661,8 +661,8 @@ __gnat_error_handler (int sig, siginfo_t *si ATTRIBUTE_UNUSED, void *ucontext) break; case SIGBUS: - exception = &constraint_error; - msg = "SIGBUS"; + exception = &storage_error; + msg = "SIGBUS: possible stack overflow"; break; case SIGFPE: -- 2.7.4