@@ -11601,25 +11601,7 @@ package body Sem_Ch12 is
-- indicate that the body instance is to be delayed.
Install_Body (Act_Body, Inst_Node, Gen_Body, Gen_Decl);
-
- -- Now analyze the body. We turn off all checks if this is an
- -- internal unit, since there is no reason to have checks on for
- -- any predefined run-time library code. All such code is designed
- -- to be compiled with checks off.
-
- -- Note that we do NOT apply this criterion to children of GNAT
- -- The latter units must suppress checks explicitly if needed.
-
- -- We also do not suppress checks in CodePeer mode where we are
- -- interested in finding possible runtime errors.
-
- if not CodePeer_Mode
- and then In_Predefined_Unit (Gen_Decl)
- then
- Analyze (Act_Body, Suppress => All_Checks);
- else
- Analyze (Act_Body);
- end if;
+ Analyze (Act_Body);
end if;
Inherit_Context (Gen_Body, Inst_Node);
@@ -1056,9 +1056,17 @@ package body Sem_Ch6 is
-- Apply constraint check. Note that this is done before the implicit
-- conversion of the expression done for anonymous access types to
-- ensure correct generation of the null-excluding check associated
- -- with null-excluding expressions found in return statements.
-
- Apply_Constraint_Check (Expr, R_Type);
+ -- with null-excluding expressions found in return statements. We
+ -- don't need a check if the subtype of the return object is the
+ -- same as the result subtype of the function.
+
+ if Nkind (N) /= N_Extended_Return_Statement
+ or else Nkind (Obj_Decl) /= N_Object_Declaration
+ or else Nkind (Object_Definition (Obj_Decl)) not in N_Has_Entity
+ or else Entity (Object_Definition (Obj_Decl)) /= R_Type
+ then
+ Apply_Constraint_Check (Expr, R_Type);
+ end if;
-- The return value is converted to the return type of the function,
-- which implies a predicate check if the return type is predicated.