+2017-01-23 Pascal Obry <obry@adacore.com>
+
+ * s-taprop-mingw.adb (Enter_Task): Initialize the Thread handle which
+ is needed when a foreign thread call a Win32 API using a thread handle
+ like GetThreadTimes() for example.
+
+2017-01-23 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * sem_ch13.adb (Analyze_Attribute_Definition_Clause): Do not
+ allow an 'Address clause to be specified on a prefix of a
+ class-wide type.
+
+2017-01-23 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * checks.adb (Insert_Valid_Check): Ensure that the prefix of
+ attribute 'Valid is a renaming of the original expression when
+ the expression denotes a name. For all other kinds of expression,
+ use a constant to capture the value.
+ * exp_util.adb (Is_Name_Reference): Moved to Sem_Util.
+ * sem_util.ads, sem_util.adb (Is_Name_Reference): Moved from Exp_Util.
+
+2017-01-23 Justin Squirek <squirek@adacore.com>
+
+ * sem_eval.adb (Eval_Integer_Literal): Add special
+ case to avoid optimizing out check if the literal appears in
+ an if-expression.
+
+2017-01-23 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * sem_ch13.adb (Analyze_Attribute_Definition_Clause): Do not
+ allow an 'Address clause to be specified on a prefix of a
+ class-wide type.
+
+2017-01-23 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * checks.adb (Insert_Valid_Check): Ensure that the prefix of
+ attribute 'Valid is a renaming of the original expression when
+ the expression denotes a name. For all other kinds of expression,
+ use a constant to capture the value.
+ * exp_util.adb (Is_Name_Reference): Moved to Sem_Util.
+ * sem_util.ads, sem_util.adb (Is_Name_Reference): Moved from Exp_Util.
+
+2017-01-23 Justin Squirek <squirek@adacore.com>
+
+ * sem_eval.adb (Eval_Integer_Literal): Add special
+ case to avoid optimizing out check if the literal appears in
+ an if-expression.
+
2017-01-23 Ed Schonberg <schonberg@adacore.com>
* sem_ch4.adb (Try_Primitive_Operations,
Force_Evaluation (Exp, Name_Req => False);
end if;
- -- Build the prefix for the 'Valid call
+ -- Build the prefix for the 'Valid call. If the expression denotes
+ -- a name, use a renaming to alias it, otherwise use a constant to
+ -- capture the value of the expression.
+
+ -- Temp : ... renames Expr; -- reference to a name
+ -- Temp : constant ... := Expr; -- all other cases
PV :=
Duplicate_Subexpr_No_Checks
(Exp => Exp,
Name_Req => False,
+ Renaming_Req => Is_Name_Reference (Exp),
Related_Id => Related_Id,
Is_Low_Bound => Is_Low_Bound,
Is_High_Bound => Is_High_Bound);
-- is present (xxx is taken from the Chars field of Related_Nod),
-- otherwise it generates an internal temporary.
- function Is_Name_Reference (N : Node_Id) return Boolean;
- -- Determine if the tree referenced by N represents a name. This is
- -- similar to Is_Object_Reference but returns true only if N can be
- -- renamed without the need for a temporary, the typical example of
- -- an object not in this category being a function call.
-
---------------------
-- Build_Temporary --
---------------------
end if;
end Build_Temporary;
- -----------------------
- -- Is_Name_Reference --
- -----------------------
-
- function Is_Name_Reference (N : Node_Id) return Boolean is
- begin
- if Is_Entity_Name (N) then
- return Present (Entity (N)) and then Is_Object (Entity (N));
- end if;
-
- case Nkind (N) is
- when N_Indexed_Component
- | N_Slice
- =>
- return
- Is_Name_Reference (Prefix (N))
- or else Is_Access_Type (Etype (Prefix (N)));
-
- -- Attributes 'Input, 'Old and 'Result produce objects
-
- when N_Attribute_Reference =>
- return
- Nam_In
- (Attribute_Name (N), Name_Input, Name_Old, Name_Result);
-
- when N_Selected_Component =>
- return
- Is_Name_Reference (Selector_Name (N))
- and then
- (Is_Name_Reference (Prefix (N))
- or else Is_Access_Type (Etype (Prefix (N))));
-
- when N_Explicit_Dereference =>
- return True;
-
- -- A view conversion of a tagged name is a name reference
-
- when N_Type_Conversion =>
- return
- Is_Tagged_Type (Etype (Subtype_Mark (N)))
- and then Is_Tagged_Type (Etype (Expression (N)))
- and then Is_Name_Reference (Expression (N));
-
- -- An unchecked type conversion is considered to be a name if
- -- the operand is a name (this construction arises only as a
- -- result of expansion activities).
-
- when N_Unchecked_Type_Conversion =>
- return Is_Name_Reference (Expression (N));
-
- when others =>
- return False;
- end case;
- end Is_Name_Reference;
-
-- Local variables
Loc : constant Source_Ptr := Sloc (Exp);
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
-- --
-- GNARL 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- --
package body Specific is
+ -------------------
+ -- Is_Valid_Task --
+ -------------------
+
function Is_Valid_Task return Boolean is
begin
return TlsGetValue (TlsIndex) /= System.Null_Address;
end Is_Valid_Task;
+ ---------
+ -- Set --
+ ---------
+
procedure Set (Self_Id : Task_Id) is
Succeeded : BOOL;
begin
-- 1) from System.Task_Primitives.Operations.Initialize
-- 2) from System.Tasking.Stages.Task_Wrapper
- -- The thread initialisation has to be done only for the first case
-
- -- This is because the GetCurrentThread NT call does not return the real
- -- thread handler but only a "pseudo" one. It is not possible to release
- -- the thread handle and free the system resources from this "pseudo"
- -- handle. So we really want to keep the real thread handle set in
- -- System.Task_Primitives.Operations.Create_Task during thread creation.
+ -- The pseudo handle (LL.Thread) need not be closed when it is no
+ -- longer needed. Calling the CloseHandle function with this handle
+ -- has no effect.
procedure Enter_Task (Self_ID : Task_Id) is
procedure Get_Stack_Bounds (Base : Address; Limit : Address);
raise Invalid_CPU_Number;
end if;
+ Self_ID.Common.LL.Thread := GetCurrentThread;
Self_ID.Common.LL.Thread_Id := GetCurrentThreadId;
Get_Stack_Bounds
DWORD (Stack_Size),
Entry_Point,
pTaskParameter,
- DWORD (Create_Suspended) or
- DWORD (Stack_Size_Param_Is_A_Reservation),
+ DWORD (Create_Suspended)
+ or DWORD (Stack_Size_Param_Is_A_Reservation),
TaskId'Unchecked_Access);
else
hTask := CreateThread
or else Has_Controlled_Component (Etype (U_Ent))
then
Error_Msg_NE
- ("??controlled object& must not be overlaid", Nam, U_Ent);
+ ("??controlled object & must not be overlaid", Nam, U_Ent);
+ Error_Msg_N
+ ("\??Program_Error will be raised at run time", Nam);
+ Insert_Action (Declaration_Node (U_Ent),
+ Make_Raise_Program_Error (Loc,
+ Reason => PE_Overlaid_Controlled_Object));
+ return;
+
+ -- Case of an address clause for a class-wide object which is
+ -- considered erroneous.
+
+ elsif Is_Class_Wide_Type (Etype (U_Ent)) then
+ Error_Msg_NE
+ ("??class-wide object & must not be overlaid", Nam, U_Ent);
Error_Msg_N
("\??Program_Error will be raised at run time", Nam);
Insert_Action (Declaration_Node (U_Ent),
-- If the literal appears in a non-expression context, then it is
-- certainly appearing in a non-static context, so check it. This is
-- actually a redundant check, since Check_Non_Static_Context would
- -- check it, but it seems worth while avoiding the call.
+ -- check it, but it seems worth while to optimize out the call.
- if Nkind (Parent (N)) not in N_Subexpr
+ -- An exception is made for a literal in an if or case expression
+
+ if (Nkind_In (Parent (N), N_If_Expression, N_Case_Expression_Alternative)
+ or else Nkind (Parent (N)) not in N_Subexpr)
and then not In_Any_Integer_Context
then
Check_Non_Static_Context (N);
end if;
end Is_Local_Variable_Reference;
+ -----------------------
+ -- Is_Name_Reference --
+ -----------------------
+
+ function Is_Name_Reference (N : Node_Id) return Boolean is
+ begin
+ if Is_Entity_Name (N) then
+ return Present (Entity (N)) and then Is_Object (Entity (N));
+ end if;
+
+ case Nkind (N) is
+ when N_Indexed_Component
+ | N_Slice
+ =>
+ return
+ Is_Name_Reference (Prefix (N))
+ or else Is_Access_Type (Etype (Prefix (N)));
+
+ -- Attributes 'Input, 'Old and 'Result produce objects
+
+ when N_Attribute_Reference =>
+ return
+ Nam_In (Attribute_Name (N), Name_Input, Name_Old, Name_Result);
+
+ when N_Selected_Component =>
+ return
+ Is_Name_Reference (Selector_Name (N))
+ and then
+ (Is_Name_Reference (Prefix (N))
+ or else Is_Access_Type (Etype (Prefix (N))));
+
+ when N_Explicit_Dereference =>
+ return True;
+
+ -- A view conversion of a tagged name is a name reference
+
+ when N_Type_Conversion =>
+ return
+ Is_Tagged_Type (Etype (Subtype_Mark (N)))
+ and then Is_Tagged_Type (Etype (Expression (N)))
+ and then Is_Name_Reference (Expression (N));
+
+ -- An unchecked type conversion is considered to be a name if the
+ -- operand is a name (this construction arises only as a result of
+ -- expansion activities).
+
+ when N_Unchecked_Type_Conversion =>
+ return Is_Name_Reference (Expression (N));
+
+ when others =>
+ return False;
+ end case;
+ end Is_Name_Reference;
+
---------------------------------
-- Is_Nontrivial_DIC_Procedure --
---------------------------------
-- parameter of the current enclosing subprogram.
-- Why are OUT parameters not considered here ???
+ function Is_Name_Reference (N : Node_Id) return Boolean;
+ -- Determine whether arbitrary node N is a reference to a name. This is
+ -- similar to Is_Object_Reference but returns True only if N can be renamed
+ -- without the need for a temporary, the typical example of an object not
+ -- in this category being a function call.
+
function Is_Nontrivial_DIC_Procedure (Id : Entity_Id) return Boolean;
-- Determine whether entity Id denotes the procedure that verifies the
-- assertion expression of pragma Default_Initial_Condition and if it does,