Commit 104da10b by Arnaud Charlet

Remove extra ^M characters introduced in previous commit.

From-SVN: r73251
parent 12e0c41c
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
-- -- -- --
-- GNAT COMPILER COMPONENTS -- -- GNAT COMPILER COMPONENTS --
-- -- -- --
-- S N A M E S -- -- S N A M E S --
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2003, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2003, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 2, or (at your option) any later ver- -- -- ware Foundation; either version 2, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General -- -- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING. If not, write -- -- Public License distributed with GNAT; see file COPYING. If not, write --
-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
-- MA 02111-1307, USA. -- -- MA 02111-1307, USA. --
-- -- -- --
-- As a special exception, if other files instantiate generics from this -- -- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, -- -- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be -- -- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not -- -- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be -- -- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. -- -- covered by the GNU Public License. --
-- -- -- --
-- GNAT was originally developed by the GNAT team at New York University. -- -- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. -- -- Extensive contributions were provided by Ada Core Technologies Inc. --
-- -- -- --
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
with Namet; use Namet; with Namet; use Namet;
with Table; with Table;
package body Snames is package body Snames is
-- Table used to record convention identifiers -- Table used to record convention identifiers
type Convention_Id_Entry is record type Convention_Id_Entry is record
Name : Name_Id; Name : Name_Id;
Convention : Convention_Id; Convention : Convention_Id;
end record; end record;
package Convention_Identifiers is new Table.Table ( package Convention_Identifiers is new Table.Table (
Table_Component_Type => Convention_Id_Entry, Table_Component_Type => Convention_Id_Entry,
Table_Index_Type => Int, Table_Index_Type => Int,
Table_Low_Bound => 1, Table_Low_Bound => 1,
Table_Initial => 50, Table_Initial => 50,
Table_Increment => 200, Table_Increment => 200,
Table_Name => "Name_Convention_Identifiers"); Table_Name => "Name_Convention_Identifiers");
-- Table of names to be set by Initialize. Each name is terminated by a -- Table of names to be set by Initialize. Each name is terminated by a
-- single #, and the end of the list is marked by a null entry, i.e. by -- single #, and the end of the list is marked by a null entry, i.e. by
-- two # marks in succession. Note that the table does not include the -- two # marks in succession. Note that the table does not include the
-- entries for a-z, since these are initialized by Namet itself. -- entries for a-z, since these are initialized by Namet itself.
Preset_Names : constant String := Preset_Names : constant String :=
"_parent#" & "_parent#" &
"_tag#" & "_tag#" &
"off#" & "off#" &
"space#" & "space#" &
"time#" & "time#" &
"_abort_signal#" & "_abort_signal#" &
"_alignment#" & "_alignment#" &
"_assign#" & "_assign#" &
"_chain#" & "_chain#" &
"_clean#" & "_clean#" &
"_controller#" & "_controller#" &
"_entry_bodies#" & "_entry_bodies#" &
"_expunge#" & "_expunge#" &
"_final_list#" & "_final_list#" &
"_idepth#" & "_idepth#" &
"_init#" & "_init#" &
"_local_final_list#" & "_local_final_list#" &
"_master#" & "_master#" &
"_object#" & "_object#" &
"_priority#" & "_priority#" &
"_process_atsd#" & "_process_atsd#" &
"_secondary_stack#" & "_secondary_stack#" &
"_service#" & "_service#" &
"_size#" & "_size#" &
"_tags#" & "_tags#" &
"_task#" & "_task#" &
"_task_id#" & "_task_id#" &
"_task_info#" & "_task_info#" &
"_task_name#" & "_task_name#" &
"_trace_sp#" & "_trace_sp#" &
"initialize#" & "initialize#" &
"adjust#" & "adjust#" &
"finalize#" & "finalize#" &
"next#" & "next#" &
"prev#" & "prev#" &
"allocate#" & "allocate#" &
"deallocate#" & "deallocate#" &
"dereference#" & "dereference#" &
"decimal_io#" & "decimal_io#" &
"enumeration_io#" & "enumeration_io#" &
"fixed_io#" & "fixed_io#" &
"float_io#" & "float_io#" &
"integer_io#" & "integer_io#" &
"modular_io#" & "modular_io#" &
"a_textio#" & "a_textio#" &
"a_witeio#" & "a_witeio#" &
"const#" & "const#" &
"<error>#" & "<error>#" &
"go#" & "go#" &
"put#" & "put#" &
"put_line#" & "put_line#" &
"to#" & "to#" &
"finalization#" & "finalization#" &
"finalization_root#" & "finalization_root#" &
"interfaces#" & "interfaces#" &
"standard#" & "standard#" &
"system#" & "system#" &
"text_io#" & "text_io#" &
"wide_text_io#" & "wide_text_io#" &
"addr#" & "addr#" &
"async#" & "async#" &
"get_active_partition_id#" & "get_active_partition_id#" &
"get_rci_package_receiver#" & "get_rci_package_receiver#" &
"origin#" & "origin#" &
"params#" & "params#" &
"partition#" & "partition#" &
"partition_interface#" & "partition_interface#" &
"ras#" & "ras#" &
"rci_name#" & "rci_name#" &
"receiver#" & "receiver#" &
"result#" & "result#" &
"rpc#" & "rpc#" &
"subp_id#" & "subp_id#" &
"Oabs#" & "Oabs#" &
"Oand#" & "Oand#" &
"Omod#" & "Omod#" &
"Onot#" & "Onot#" &
"Oor#" & "Oor#" &
"Orem#" & "Orem#" &
"Oxor#" & "Oxor#" &
"Oeq#" & "Oeq#" &
"One#" & "One#" &
"Olt#" & "Olt#" &
"Ole#" & "Ole#" &
"Ogt#" & "Ogt#" &
"Oge#" & "Oge#" &
"Oadd#" & "Oadd#" &
"Osubtract#" & "Osubtract#" &
"Oconcat#" & "Oconcat#" &
"Omultiply#" & "Omultiply#" &
"Odivide#" & "Odivide#" &
"Oexpon#" & "Oexpon#" &
"ada_83#" & "ada_83#" &
"ada_95#" & "ada_95#" &
"c_pass_by_copy#" & "c_pass_by_copy#" &
"compile_time_warning#" & "compile_time_warning#" &
"component_alignment#" & "component_alignment#" &
"convention_identifier#" & "convention_identifier#" &
"discard_names#" & "discard_names#" &
"elaboration_checks#" & "elaboration_checks#" &
"eliminate#" & "eliminate#" &
"explicit_overriding#" & "explicit_overriding#" &
"extend_system#" & "extend_system#" &
"extensions_allowed#" & "extensions_allowed#" &
"external_name_casing#" & "external_name_casing#" &
"float_representation#" & "float_representation#" &
"initialize_scalars#" & "initialize_scalars#" &
"interrupt_state#" & "interrupt_state#" &
"license#" & "license#" &
"locking_policy#" & "locking_policy#" &
"long_float#" & "long_float#" &
"no_run_time#" & "no_run_time#" &
"normalize_scalars#" & "normalize_scalars#" &
"polling#" & "polling#" &
"persistent_data#" & "persistent_data#" &
"persistent_object#" & "persistent_object#" &
"propagate_exceptions#" & "propagate_exceptions#" &
"queuing_policy#" & "queuing_policy#" &
"ravenscar#" & "ravenscar#" &
"restricted_run_time#" & "restricted_run_time#" &
"restrictions#" & "restrictions#" &
"restriction_warnings#" & "restriction_warnings#" &
"reviewable#" & "reviewable#" &
"source_file_name#" & "source_file_name#" &
"source_file_name_project#" & "source_file_name_project#" &
"style_checks#" & "style_checks#" &
"suppress#" & "suppress#" &
"suppress_exception_locations#" & "suppress_exception_locations#" &
"task_dispatching_policy#" & "task_dispatching_policy#" &
"universal_data#" & "universal_data#" &
"unsuppress#" & "unsuppress#" &
"use_vads_size#" & "use_vads_size#" &
"validity_checks#" & "validity_checks#" &
"warnings#" & "warnings#" &
"abort_defer#" & "abort_defer#" &
"all_calls_remote#" & "all_calls_remote#" &
"annotate#" & "annotate#" &
"assert#" & "assert#" &
"asynchronous#" & "asynchronous#" &
"atomic#" & "atomic#" &
"atomic_components#" & "atomic_components#" &
"attach_handler#" & "attach_handler#" &
"comment#" & "comment#" &
"common_object#" & "common_object#" &
"complex_representation#" & "complex_representation#" &
"controlled#" & "controlled#" &
"convention#" & "convention#" &
"cpp_class#" & "cpp_class#" &
"cpp_constructor#" & "cpp_constructor#" &
"cpp_virtual#" & "cpp_virtual#" &
"cpp_vtable#" & "cpp_vtable#" &
"debug#" & "debug#" &
"elaborate#" & "elaborate#" &
"elaborate_all#" & "elaborate_all#" &
"elaborate_body#" & "elaborate_body#" &
"export#" & "export#" &
"export_exception#" & "export_exception#" &
"export_function#" & "export_function#" &
"export_object#" & "export_object#" &
"export_procedure#" & "export_procedure#" &
"export_value#" & "export_value#" &
"export_valued_procedure#" & "export_valued_procedure#" &
"external#" & "external#" &
"finalize_storage_only#" & "finalize_storage_only#" &
"ident#" & "ident#" &
"import#" & "import#" &
"import_exception#" & "import_exception#" &
"import_function#" & "import_function#" &
"import_object#" & "import_object#" &
"import_procedure#" & "import_procedure#" &
"import_valued_procedure#" & "import_valued_procedure#" &
"inline#" & "inline#" &
"inline_always#" & "inline_always#" &
"inline_generic#" & "inline_generic#" &
"inspection_point#" & "inspection_point#" &
"interface#" & "interface#" &
"interface_name#" & "interface_name#" &
"interrupt_handler#" & "interrupt_handler#" &
"interrupt_priority#" & "interrupt_priority#" &
"java_constructor#" & "java_constructor#" &
"java_interface#" & "java_interface#" &
"keep_names#" & "keep_names#" &
"link_with#" & "link_with#" &
"linker_alias#" & "linker_alias#" &
"linker_options#" & "linker_options#" &
"linker_section#" & "linker_section#" &
"list#" & "list#" &
"machine_attribute#" & "machine_attribute#" &
"main#" & "main#" &
"main_storage#" & "main_storage#" &
"memory_size#" & "memory_size#" &
"no_return#" & "no_return#" &
"obsolescent#" & "obsolescent#" &
"optimize#" & "optimize#" &
"optional_overriding#" & "optional_overriding#" &
"overriding#" & "overriding#" &
"pack#" & "pack#" &
"page#" & "page#" &
"passive#" & "passive#" &
"preelaborate#" & "preelaborate#" &
"priority#" & "priority#" &
"psect_object#" & "psect_object#" &
"pure#" & "pure#" &
"pure_function#" & "pure_function#" &
"remote_call_interface#" & "remote_call_interface#" &
"remote_types#" & "remote_types#" &
"share_generic#" & "share_generic#" &
"shared#" & "shared#" &
"shared_passive#" & "shared_passive#" &
"source_reference#" & "source_reference#" &
"stream_convert#" & "stream_convert#" &
"subtitle#" & "subtitle#" &
"suppress_all#" & "suppress_all#" &
"suppress_debug_info#" & "suppress_debug_info#" &
"suppress_initialization#" & "suppress_initialization#" &
"system_name#" & "system_name#" &
"task_info#" & "task_info#" &
"task_name#" & "task_name#" &
"task_storage#" & "task_storage#" &
"thread_body#" & "thread_body#" &
"time_slice#" & "time_slice#" &
"title#" & "title#" &
"unchecked_union#" & "unchecked_union#" &
"unimplemented_unit#" & "unimplemented_unit#" &
"unreferenced#" & "unreferenced#" &
"unreserve_all_interrupts#" & "unreserve_all_interrupts#" &
"volatile#" & "volatile#" &
"volatile_components#" & "volatile_components#" &
"weak_external#" & "weak_external#" &
"ada#" & "ada#" &
"assembler#" & "assembler#" &
"cobol#" & "cobol#" &
"cpp#" & "cpp#" &
"fortran#" & "fortran#" &
"intrinsic#" & "intrinsic#" &
"java#" & "java#" &
"stdcall#" & "stdcall#" &
"stubbed#" & "stubbed#" &
"asm#" & "asm#" &
"assembly#" & "assembly#" &
"default#" & "default#" &
"dll#" & "dll#" &
"win32#" & "win32#" &
"as_is#" & "as_is#" &
"body_file_name#" & "body_file_name#" &
"casing#" & "casing#" &
"code#" & "code#" &
"component#" & "component#" &
"component_size_4#" & "component_size_4#" &
"copy#" & "copy#" &
"d_float#" & "d_float#" &
"descriptor#" & "descriptor#" &
"dot_replacement#" & "dot_replacement#" &
"dynamic#" & "dynamic#" &
"entity#" & "entity#" &
"external_name#" & "external_name#" &
"first_optional_parameter#" & "first_optional_parameter#" &
"form#" & "form#" &
"g_float#" & "g_float#" &
"gcc#" & "gcc#" &
"gnat#" & "gnat#" &
"gpl#" & "gpl#" &
"ieee_float#" & "ieee_float#" &
"homonym_number#" & "homonym_number#" &
"internal#" & "internal#" &
"link_name#" & "link_name#" &
"lowercase#" & "lowercase#" &
"max_size#" & "max_size#" &
"mechanism#" & "mechanism#" &
"mixedcase#" & "mixedcase#" &
"modified_gpl#" & "modified_gpl#" &
"name#" & "name#" &
"nca#" & "nca#" &
"no#" & "no#" &
"on#" & "on#" &
"parameter_types#" & "parameter_types#" &
"reference#" & "reference#" &
"restricted#" & "restricted#" &
"result_mechanism#" & "result_mechanism#" &
"result_type#" & "result_type#" &
"runtime#" & "runtime#" &
"sb#" & "sb#" &
"secondary_stack_size#" & "secondary_stack_size#" &
"section#" & "section#" &
"semaphore#" & "semaphore#" &
"spec_file_name#" & "spec_file_name#" &
"static#" & "static#" &
"stack_size#" & "stack_size#" &
"subunit_file_name#" & "subunit_file_name#" &
"task_stack_size_default#" & "task_stack_size_default#" &
"task_type#" & "task_type#" &
"time_slicing_enabled#" & "time_slicing_enabled#" &
"top_guard#" & "top_guard#" &
"uba#" & "uba#" &
"ubs#" & "ubs#" &
"ubsb#" & "ubsb#" &
"unit_name#" & "unit_name#" &
"unknown#" & "unknown#" &
"unrestricted#" & "unrestricted#" &
"uppercase#" & "uppercase#" &
"user#" & "user#" &
"vax_float#" & "vax_float#" &
"vms#" & "vms#" &
"working_storage#" & "working_storage#" &
"abort_signal#" & "abort_signal#" &
"access#" & "access#" &
"address#" & "address#" &
"address_size#" & "address_size#" &
"aft#" & "aft#" &
"alignment#" & "alignment#" &
"asm_input#" & "asm_input#" &
"asm_output#" & "asm_output#" &
"ast_entry#" & "ast_entry#" &
"bit#" & "bit#" &
"bit_order#" & "bit_order#" &
"bit_position#" & "bit_position#" &
"body_version#" & "body_version#" &
"callable#" & "callable#" &
"caller#" & "caller#" &
"code_address#" & "code_address#" &
"component_size#" & "component_size#" &
"compose#" & "compose#" &
"constrained#" & "constrained#" &
"count#" & "count#" &
"default_bit_order#" & "default_bit_order#" &
"definite#" & "definite#" &
"delta#" & "delta#" &
"denorm#" & "denorm#" &
"digits#" & "digits#" &
"elaborated#" & "elaborated#" &
"emax#" & "emax#" &
"enum_rep#" & "enum_rep#" &
"epsilon#" & "epsilon#" &
"exponent#" & "exponent#" &
"external_tag#" & "external_tag#" &
"first#" & "first#" &
"first_bit#" & "first_bit#" &
"fixed_value#" & "fixed_value#" &
"fore#" & "fore#" &
"has_discriminants#" & "has_discriminants#" &
"identity#" & "identity#" &
"img#" & "img#" &
"integer_value#" & "integer_value#" &
"large#" & "large#" &
"last#" & "last#" &
"last_bit#" & "last_bit#" &
"leading_part#" & "leading_part#" &
"length#" & "length#" &
"machine_emax#" & "machine_emax#" &
"machine_emin#" & "machine_emin#" &
"machine_mantissa#" & "machine_mantissa#" &
"machine_overflows#" & "machine_overflows#" &
"machine_radix#" & "machine_radix#" &
"machine_rounds#" & "machine_rounds#" &
"machine_size#" & "machine_size#" &
"mantissa#" & "mantissa#" &
"max_size_in_storage_elements#" & "max_size_in_storage_elements#" &
"maximum_alignment#" & "maximum_alignment#" &
"mechanism_code#" & "mechanism_code#" &
"model_emin#" & "model_emin#" &
"model_epsilon#" & "model_epsilon#" &
"model_mantissa#" & "model_mantissa#" &
"model_small#" & "model_small#" &
"modulus#" & "modulus#" &
"null_parameter#" & "null_parameter#" &
"object_size#" & "object_size#" &
"partition_id#" & "partition_id#" &
"passed_by_reference#" & "passed_by_reference#" &
"pool_address#" & "pool_address#" &
"pos#" & "pos#" &
"position#" & "position#" &
"range#" & "range#" &
"range_length#" & "range_length#" &
"round#" & "round#" &
"safe_emax#" & "safe_emax#" &
"safe_first#" & "safe_first#" &
"safe_large#" & "safe_large#" &
"safe_last#" & "safe_last#" &
"safe_small#" & "safe_small#" &
"scale#" & "scale#" &
"scaling#" & "scaling#" &
"signed_zeros#" & "signed_zeros#" &
"size#" & "size#" &
"small#" & "small#" &
"storage_size#" & "storage_size#" &
"storage_unit#" & "storage_unit#" &
"tag#" & "tag#" &
"target_name#" & "target_name#" &
"terminated#" & "terminated#" &
"to_address#" & "to_address#" &
"type_class#" & "type_class#" &
"uet_address#" & "uet_address#" &
"unbiased_rounding#" & "unbiased_rounding#" &
"unchecked_access#" & "unchecked_access#" &
"unconstrained_array#" & "unconstrained_array#" &
"universal_literal_string#" & "universal_literal_string#" &
"unrestricted_access#" & "unrestricted_access#" &
"vads_size#" & "vads_size#" &
"val#" & "val#" &
"valid#" & "valid#" &
"value_size#" & "value_size#" &
"version#" & "version#" &
"wchar_t_size#" & "wchar_t_size#" &
"wide_width#" & "wide_width#" &
"width#" & "width#" &
"word_size#" & "word_size#" &
"adjacent#" & "adjacent#" &
"ceiling#" & "ceiling#" &
"copy_sign#" & "copy_sign#" &
"floor#" & "floor#" &
"fraction#" & "fraction#" &
"image#" & "image#" &
"input#" & "input#" &
"machine#" & "machine#" &
"max#" & "max#" &
"min#" & "min#" &
"model#" & "model#" &
"pred#" & "pred#" &
"remainder#" & "remainder#" &
"rounding#" & "rounding#" &
"succ#" & "succ#" &
"truncation#" & "truncation#" &
"value#" & "value#" &
"wide_image#" & "wide_image#" &
"wide_value#" & "wide_value#" &
"output#" & "output#" &
"read#" & "read#" &
"write#" & "write#" &
"elab_body#" & "elab_body#" &
"elab_spec#" & "elab_spec#" &
"storage_pool#" & "storage_pool#" &
"base#" & "base#" &
"class#" & "class#" &
"ceiling_locking#" & "ceiling_locking#" &
"inheritance_locking#" & "inheritance_locking#" &
"fifo_queuing#" & "fifo_queuing#" &
"priority_queuing#" & "priority_queuing#" &
"fifo_within_priorities#" & "fifo_within_priorities#" &
"access_check#" & "access_check#" &
"accessibility_check#" & "accessibility_check#" &
"discriminant_check#" & "discriminant_check#" &
"division_check#" & "division_check#" &
"elaboration_check#" & "elaboration_check#" &
"index_check#" & "index_check#" &
"length_check#" & "length_check#" &
"overflow_check#" & "overflow_check#" &
"range_check#" & "range_check#" &
"storage_check#" & "storage_check#" &
"tag_check#" & "tag_check#" &
"all_checks#" & "all_checks#" &
"abort#" & "abort#" &
"abs#" & "abs#" &
"accept#" & "accept#" &
"and#" & "and#" &
"all#" & "all#" &
"array#" & "array#" &
"at#" & "at#" &
"begin#" & "begin#" &
"body#" & "body#" &
"case#" & "case#" &
"constant#" & "constant#" &
"declare#" & "declare#" &
"delay#" & "delay#" &
"do#" & "do#" &
"else#" & "else#" &
"elsif#" & "elsif#" &
"end#" & "end#" &
"entry#" & "entry#" &
"exception#" & "exception#" &
"exit#" & "exit#" &
"for#" & "for#" &
"function#" & "function#" &
"generic#" & "generic#" &
"goto#" & "goto#" &
"if#" & "if#" &
"in#" & "in#" &
"is#" & "is#" &
"limited#" & "limited#" &
"loop#" & "loop#" &
"mod#" & "mod#" &
"new#" & "new#" &
"not#" & "not#" &
"null#" & "null#" &
"of#" & "of#" &
"or#" & "or#" &
"others#" & "others#" &
"out#" & "out#" &
"package#" & "package#" &
"pragma#" & "pragma#" &
"private#" & "private#" &
"procedure#" & "procedure#" &
"raise#" & "raise#" &
"record#" & "record#" &
"rem#" & "rem#" &
"renames#" & "renames#" &
"return#" & "return#" &
"reverse#" & "reverse#" &
"select#" & "select#" &
"separate#" & "separate#" &
"subtype#" & "subtype#" &
"task#" & "task#" &
"terminate#" & "terminate#" &
"then#" & "then#" &
"type#" & "type#" &
"use#" & "use#" &
"when#" & "when#" &
"while#" & "while#" &
"with#" & "with#" &
"xor#" & "xor#" &
"divide#" & "divide#" &
"enclosing_entity#" & "enclosing_entity#" &
"exception_information#" & "exception_information#" &
"exception_message#" & "exception_message#" &
"exception_name#" & "exception_name#" &
"file#" & "file#" &
"import_address#" & "import_address#" &
"import_largest_value#" & "import_largest_value#" &
"import_value#" & "import_value#" &
"is_negative#" & "is_negative#" &
"line#" & "line#" &
"rotate_left#" & "rotate_left#" &
"rotate_right#" & "rotate_right#" &
"shift_left#" & "shift_left#" &
"shift_right#" & "shift_right#" &
"shift_right_arithmetic#" & "shift_right_arithmetic#" &
"source_location#" & "source_location#" &
"unchecked_conversion#" & "unchecked_conversion#" &
"unchecked_deallocation#" & "unchecked_deallocation#" &
"to_pointer#" & "to_pointer#" &
"abstract#" & "abstract#" &
"aliased#" & "aliased#" &
"protected#" & "protected#" &
"until#" & "until#" &
"requeue#" & "requeue#" &
"tagged#" & "tagged#" &
"raise_exception#" & "raise_exception#" &
"binder#" & "binder#" &
"body_suffix#" & "body_suffix#" &
"builder#" & "builder#" &
"compiler#" & "compiler#" &
"cross_reference#" & "cross_reference#" &
"default_switches#" & "default_switches#" &
"exec_dir#" & "exec_dir#" &
"executable#" & "executable#" &
"executable_suffix#" & "executable_suffix#" &
"extends#" & "extends#" &
"finder#" & "finder#" &
"global_configuration_pragmas#" & "global_configuration_pragmas#" &
"gnatls#" & "gnatls#" &
"gnatstub#" & "gnatstub#" &
"implementation#" & "implementation#" &
"implementation_exceptions#" & "implementation_exceptions#" &
"implementation_suffix#" & "implementation_suffix#" &
"languages#" & "languages#" &
"library_dir#" & "library_dir#" &
"library_auto_init#" & "library_auto_init#" &
"library_gcc#" & "library_gcc#" &
"library_interface#" & "library_interface#" &
"library_kind#" & "library_kind#" &
"library_name#" & "library_name#" &
"library_options#" & "library_options#" &
"library_src_dir#" & "library_src_dir#" &
"library_symbol_file#" & "library_symbol_file#" &
"library_version#" & "library_version#" &
"linker#" & "linker#" &
"local_configuration_pragmas#" & "local_configuration_pragmas#" &
"locally_removed_files#" & "locally_removed_files#" &
"naming#" & "naming#" &
"object_dir#" & "object_dir#" &
"pretty_printer#" & "pretty_printer#" &
"project#" & "project#" &
"separate_suffix#" & "separate_suffix#" &
"source_dirs#" & "source_dirs#" &
"source_files#" & "source_files#" &
"source_list_file#" & "source_list_file#" &
"spec#" & "spec#" &
"spec_suffix#" & "spec_suffix#" &
"specification#" & "specification#" &
"specification_exceptions#" & "specification_exceptions#" &
"specification_suffix#" & "specification_suffix#" &
"switches#" & "switches#" &
"unaligned_valid#" & "unaligned_valid#" &
"#"; "#";
--------------------- ---------------------
-- Generated Names -- -- Generated Names --
--------------------- ---------------------
-- This section lists the various cases of generated names which are -- This section lists the various cases of generated names which are
-- built from existing names by adding unique leading and/or trailing -- built from existing names by adding unique leading and/or trailing
-- upper case letters. In some cases these names are built recursively, -- upper case letters. In some cases these names are built recursively,
-- in particular names built from types may be built from types which -- in particular names built from types may be built from types which
-- themselves have generated names. In this list, xxx represents an -- themselves have generated names. In this list, xxx represents an
-- existing name to which identifying letters are prepended or appended, -- existing name to which identifying letters are prepended or appended,
-- and a trailing n represents a serial number in an external name that -- and a trailing n represents a serial number in an external name that
-- has some semantic significance (e.g. the n'th index type of an array). -- has some semantic significance (e.g. the n'th index type of an array).
-- xxxA access type for formal xxx in entry param record (Exp_Ch9) -- xxxA access type for formal xxx in entry param record (Exp_Ch9)
-- xxxB tag table for tagged type xxx (Exp_Ch3) -- xxxB tag table for tagged type xxx (Exp_Ch3)
-- xxxB task body procedure for task xxx (Exp_Ch9) -- xxxB task body procedure for task xxx (Exp_Ch9)
-- xxxD dispatch table for tagged type xxx (Exp_Ch3) -- xxxD dispatch table for tagged type xxx (Exp_Ch3)
-- xxxD discriminal for discriminant xxx (Sem_Ch3) -- xxxD discriminal for discriminant xxx (Sem_Ch3)
-- xxxDn n'th discr check function for rec type xxx (Exp_Ch3) -- xxxDn n'th discr check function for rec type xxx (Exp_Ch3)
-- xxxE elaboration boolean flag for task xxx (Exp_Ch9) -- xxxE elaboration boolean flag for task xxx (Exp_Ch9)
-- xxxE dispatch table pointer type for tagged type xxx (Exp_Ch3) -- xxxE dispatch table pointer type for tagged type xxx (Exp_Ch3)
-- xxxE parameters for accept body for entry xxx (Exp_Ch9) -- xxxE parameters for accept body for entry xxx (Exp_Ch9)
-- xxxFn n'th primitive of a tagged type (named xxx) (Exp_Ch3) -- xxxFn n'th primitive of a tagged type (named xxx) (Exp_Ch3)
-- xxxJ tag table type index for tagged type xxx (Exp_Ch3) -- xxxJ tag table type index for tagged type xxx (Exp_Ch3)
-- xxxM master Id value for access type xxx (Exp_Ch3) -- xxxM master Id value for access type xxx (Exp_Ch3)
-- xxxP tag table pointer type for tagged type xxx (Exp_Ch3) -- xxxP tag table pointer type for tagged type xxx (Exp_Ch3)
-- xxxP parameter record type for entry xxx (Exp_Ch9) -- xxxP parameter record type for entry xxx (Exp_Ch9)
-- xxxPA access to parameter record type for entry xxx (Exp_Ch9) -- xxxPA access to parameter record type for entry xxx (Exp_Ch9)
-- xxxPn pointer type for n'th primitive of tagged type xxx (Exp_Ch3) -- xxxPn pointer type for n'th primitive of tagged type xxx (Exp_Ch3)
-- xxxR dispatch table pointer for tagged type xxx (Exp_Ch3) -- xxxR dispatch table pointer for tagged type xxx (Exp_Ch3)
-- xxxT tag table type for tagged type xxx (Exp_Ch3) -- xxxT tag table type for tagged type xxx (Exp_Ch3)
-- xxxT literal table for enumeration type xxx (Sem_Ch3) -- xxxT literal table for enumeration type xxx (Sem_Ch3)
-- xxxV type for task value record for task xxx (Exp_Ch9) -- xxxV type for task value record for task xxx (Exp_Ch9)
-- xxxX entry index constant (Exp_Ch9) -- xxxX entry index constant (Exp_Ch9)
-- xxxY dispatch table type for tagged type xxx (Exp_Ch3) -- xxxY dispatch table type for tagged type xxx (Exp_Ch3)
-- xxxZ size variable for task xxx (Exp_Ch9) -- xxxZ size variable for task xxx (Exp_Ch9)
-- TSS names -- TSS names
-- xxxDA deep adjust routine for type xxx (Exp_TSS) -- xxxDA deep adjust routine for type xxx (Exp_TSS)
-- xxxDF deep finalize routine for type xxx (Exp_TSS) -- xxxDF deep finalize routine for type xxx (Exp_TSS)
-- xxxDI deep initialize routine for type xxx (Exp_TSS) -- xxxDI deep initialize routine for type xxx (Exp_TSS)
-- xxxEQ composite equality routine for record type xxx (Exp_TSS) -- xxxEQ composite equality routine for record type xxx (Exp_TSS)
-- xxxIP initialization procedure for type xxx (Exp_TSS) -- xxxIP initialization procedure for type xxx (Exp_TSS)
-- xxxRA RAs type access routine for type xxx (Exp_TSS) -- xxxRA RAs type access routine for type xxx (Exp_TSS)
-- xxxRD RAs type dereference routine for type xxx (Exp_TSS) -- xxxRD RAs type dereference routine for type xxx (Exp_TSS)
-- xxxRP Rep to Pos conversion for enumeration type xxx (Exp_TSS) -- xxxRP Rep to Pos conversion for enumeration type xxx (Exp_TSS)
-- xxxSI stream input attribute subprogram for type xxx (Exp_TSS) -- xxxSI stream input attribute subprogram for type xxx (Exp_TSS)
-- xxxSO stream output attribute subprogram for type xxx (Exp_TSS) -- xxxSO stream output attribute subprogram for type xxx (Exp_TSS)
-- xxxSR stream read attribute subprogram for type xxx (Exp_TSS) -- xxxSR stream read attribute subprogram for type xxx (Exp_TSS)
-- xxxSW stream write attribute subprogram for type xxx (Exp_TSS) -- xxxSW stream write attribute subprogram for type xxx (Exp_TSS)
-- Implicit type names -- Implicit type names
-- TxxxT type of literal table for enumeration type xxx (Sem_Ch3) -- TxxxT type of literal table for enumeration type xxx (Sem_Ch3)
-- (Note: this list is not complete or accurate ???) -- (Note: this list is not complete or accurate ???)
---------------------- ----------------------
-- Get_Attribute_Id -- -- Get_Attribute_Id --
---------------------- ----------------------
function Get_Attribute_Id (N : Name_Id) return Attribute_Id is function Get_Attribute_Id (N : Name_Id) return Attribute_Id is
begin begin
return Attribute_Id'Val (N - First_Attribute_Name); return Attribute_Id'Val (N - First_Attribute_Name);
end Get_Attribute_Id; end Get_Attribute_Id;
------------------ ------------------
-- Get_Check_Id -- -- Get_Check_Id --
------------------ ------------------
function Get_Check_Id (N : Name_Id) return Check_Id is function Get_Check_Id (N : Name_Id) return Check_Id is
begin begin
return Check_Id'Val (N - First_Check_Name); return Check_Id'Val (N - First_Check_Name);
end Get_Check_Id; end Get_Check_Id;
----------------------- -----------------------
-- Get_Convention_Id -- -- Get_Convention_Id --
----------------------- -----------------------
function Get_Convention_Id (N : Name_Id) return Convention_Id is function Get_Convention_Id (N : Name_Id) return Convention_Id is
begin begin
case N is case N is
when Name_Ada => return Convention_Ada; when Name_Ada => return Convention_Ada;
when Name_Assembler => return Convention_Assembler; when Name_Assembler => return Convention_Assembler;
when Name_C => return Convention_C; when Name_C => return Convention_C;
when Name_COBOL => return Convention_COBOL; when Name_COBOL => return Convention_COBOL;
when Name_CPP => return Convention_CPP; when Name_CPP => return Convention_CPP;
when Name_Fortran => return Convention_Fortran; when Name_Fortran => return Convention_Fortran;
when Name_Intrinsic => return Convention_Intrinsic; when Name_Intrinsic => return Convention_Intrinsic;
when Name_Java => return Convention_Java; when Name_Java => return Convention_Java;
when Name_Stdcall => return Convention_Stdcall; when Name_Stdcall => return Convention_Stdcall;
when Name_Stubbed => return Convention_Stubbed; when Name_Stubbed => return Convention_Stubbed;
-- If no direct match, then we must have a convention -- If no direct match, then we must have a convention
-- identifier pragma that has specified this name. -- identifier pragma that has specified this name.
when others => when others =>
for J in 1 .. Convention_Identifiers.Last loop for J in 1 .. Convention_Identifiers.Last loop
if N = Convention_Identifiers.Table (J).Name then if N = Convention_Identifiers.Table (J).Name then
return Convention_Identifiers.Table (J).Convention; return Convention_Identifiers.Table (J).Convention;
end if; end if;
end loop; end loop;
raise Program_Error; raise Program_Error;
end case; end case;
end Get_Convention_Id; end Get_Convention_Id;
--------------------------- ---------------------------
-- Get_Locking_Policy_Id -- -- Get_Locking_Policy_Id --
--------------------------- ---------------------------
function Get_Locking_Policy_Id (N : Name_Id) return Locking_Policy_Id is function Get_Locking_Policy_Id (N : Name_Id) return Locking_Policy_Id is
begin begin
return Locking_Policy_Id'Val (N - First_Locking_Policy_Name); return Locking_Policy_Id'Val (N - First_Locking_Policy_Name);
end Get_Locking_Policy_Id; end Get_Locking_Policy_Id;
------------------- -------------------
-- Get_Pragma_Id -- -- Get_Pragma_Id --
------------------- -------------------
function Get_Pragma_Id (N : Name_Id) return Pragma_Id is function Get_Pragma_Id (N : Name_Id) return Pragma_Id is
begin begin
if N = Name_AST_Entry then if N = Name_AST_Entry then
return Pragma_AST_Entry; return Pragma_AST_Entry;
elsif N = Name_Storage_Size then elsif N = Name_Storage_Size then
return Pragma_Storage_Size; return Pragma_Storage_Size;
elsif N = Name_Storage_Unit then elsif N = Name_Storage_Unit then
return Pragma_Storage_Unit; return Pragma_Storage_Unit;
elsif N not in First_Pragma_Name .. Last_Pragma_Name then elsif N not in First_Pragma_Name .. Last_Pragma_Name then
return Unknown_Pragma; return Unknown_Pragma;
else else
return Pragma_Id'Val (N - First_Pragma_Name); return Pragma_Id'Val (N - First_Pragma_Name);
end if; end if;
end Get_Pragma_Id; end Get_Pragma_Id;
--------------------------- ---------------------------
-- Get_Queuing_Policy_Id -- -- Get_Queuing_Policy_Id --
--------------------------- ---------------------------
function Get_Queuing_Policy_Id (N : Name_Id) return Queuing_Policy_Id is function Get_Queuing_Policy_Id (N : Name_Id) return Queuing_Policy_Id is
begin begin
return Queuing_Policy_Id'Val (N - First_Queuing_Policy_Name); return Queuing_Policy_Id'Val (N - First_Queuing_Policy_Name);
end Get_Queuing_Policy_Id; end Get_Queuing_Policy_Id;
------------------------------------ ------------------------------------
-- Get_Task_Dispatching_Policy_Id -- -- Get_Task_Dispatching_Policy_Id --
------------------------------------ ------------------------------------
function Get_Task_Dispatching_Policy_Id (N : Name_Id) function Get_Task_Dispatching_Policy_Id (N : Name_Id)
return Task_Dispatching_Policy_Id is return Task_Dispatching_Policy_Id is
begin begin
return Task_Dispatching_Policy_Id'Val return Task_Dispatching_Policy_Id'Val
(N - First_Task_Dispatching_Policy_Name); (N - First_Task_Dispatching_Policy_Name);
end Get_Task_Dispatching_Policy_Id; end Get_Task_Dispatching_Policy_Id;
---------------- ----------------
-- Initialize -- -- Initialize --
---------------- ----------------
procedure Initialize is procedure Initialize is
P_Index : Natural; P_Index : Natural;
Discard_Name : Name_Id; Discard_Name : Name_Id;
begin begin
P_Index := Preset_Names'First; P_Index := Preset_Names'First;
loop loop
Name_Len := 0; Name_Len := 0;
while Preset_Names (P_Index) /= '#' loop while Preset_Names (P_Index) /= '#' loop
Name_Len := Name_Len + 1; Name_Len := Name_Len + 1;
Name_Buffer (Name_Len) := Preset_Names (P_Index); Name_Buffer (Name_Len) := Preset_Names (P_Index);
P_Index := P_Index + 1; P_Index := P_Index + 1;
end loop; end loop;
-- We do the Name_Find call to enter the name into the table, but -- We do the Name_Find call to enter the name into the table, but
-- we don't need to do anything with the result, since we already -- we don't need to do anything with the result, since we already
-- initialized all the preset names to have the right value (we -- initialized all the preset names to have the right value (we
-- are depending on the order of the names and Preset_Names). -- are depending on the order of the names and Preset_Names).
Discard_Name := Name_Find; Discard_Name := Name_Find;
P_Index := P_Index + 1; P_Index := P_Index + 1;
exit when Preset_Names (P_Index) = '#'; exit when Preset_Names (P_Index) = '#';
end loop; end loop;
-- Make sure that number of names in standard table is correct. If -- Make sure that number of names in standard table is correct. If
-- this check fails, run utility program XSNAMES to construct a new -- this check fails, run utility program XSNAMES to construct a new
-- properly matching version of the body. -- properly matching version of the body.
pragma Assert (Discard_Name = Last_Predefined_Name); pragma Assert (Discard_Name = Last_Predefined_Name);
-- Initialize the convention identifiers table with the standard -- Initialize the convention identifiers table with the standard
-- set of synonyms that we recognize for conventions. -- set of synonyms that we recognize for conventions.
Convention_Identifiers.Init; Convention_Identifiers.Init;
Convention_Identifiers.Append ((Name_Asm, Convention_Assembler)); Convention_Identifiers.Append ((Name_Asm, Convention_Assembler));
Convention_Identifiers.Append ((Name_Assembly, Convention_Assembler)); Convention_Identifiers.Append ((Name_Assembly, Convention_Assembler));
Convention_Identifiers.Append ((Name_Default, Convention_C)); Convention_Identifiers.Append ((Name_Default, Convention_C));
Convention_Identifiers.Append ((Name_External, Convention_C)); Convention_Identifiers.Append ((Name_External, Convention_C));
Convention_Identifiers.Append ((Name_DLL, Convention_Stdcall)); Convention_Identifiers.Append ((Name_DLL, Convention_Stdcall));
Convention_Identifiers.Append ((Name_Win32, Convention_Stdcall)); Convention_Identifiers.Append ((Name_Win32, Convention_Stdcall));
end Initialize; end Initialize;
----------------------- -----------------------
-- Is_Attribute_Name -- -- Is_Attribute_Name --
----------------------- -----------------------
function Is_Attribute_Name (N : Name_Id) return Boolean is function Is_Attribute_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Attribute_Name .. Last_Attribute_Name; return N in First_Attribute_Name .. Last_Attribute_Name;
end Is_Attribute_Name; end Is_Attribute_Name;
------------------- -------------------
-- Is_Check_Name -- -- Is_Check_Name --
------------------- -------------------
function Is_Check_Name (N : Name_Id) return Boolean is function Is_Check_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Check_Name .. Last_Check_Name; return N in First_Check_Name .. Last_Check_Name;
end Is_Check_Name; end Is_Check_Name;
------------------------ ------------------------
-- Is_Convention_Name -- -- Is_Convention_Name --
------------------------ ------------------------
function Is_Convention_Name (N : Name_Id) return Boolean is function Is_Convention_Name (N : Name_Id) return Boolean is
begin begin
-- Check if this is one of the standard conventions -- Check if this is one of the standard conventions
if N in First_Convention_Name .. Last_Convention_Name if N in First_Convention_Name .. Last_Convention_Name
or else N = Name_C or else N = Name_C
then then
return True; return True;
-- Otherwise check if it is in convention identifier table -- Otherwise check if it is in convention identifier table
else else
for J in 1 .. Convention_Identifiers.Last loop for J in 1 .. Convention_Identifiers.Last loop
if N = Convention_Identifiers.Table (J).Name then if N = Convention_Identifiers.Table (J).Name then
return True; return True;
end if; end if;
end loop; end loop;
return False; return False;
end if; end if;
end Is_Convention_Name; end Is_Convention_Name;
------------------------------ ------------------------------
-- Is_Entity_Attribute_Name -- -- Is_Entity_Attribute_Name --
------------------------------ ------------------------------
function Is_Entity_Attribute_Name (N : Name_Id) return Boolean is function Is_Entity_Attribute_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Entity_Attribute_Name .. Last_Entity_Attribute_Name; return N in First_Entity_Attribute_Name .. Last_Entity_Attribute_Name;
end Is_Entity_Attribute_Name; end Is_Entity_Attribute_Name;
-------------------------------- --------------------------------
-- Is_Function_Attribute_Name -- -- Is_Function_Attribute_Name --
-------------------------------- --------------------------------
function Is_Function_Attribute_Name (N : Name_Id) return Boolean is function Is_Function_Attribute_Name (N : Name_Id) return Boolean is
begin begin
return N in return N in
First_Renamable_Function_Attribute .. First_Renamable_Function_Attribute ..
Last_Renamable_Function_Attribute; Last_Renamable_Function_Attribute;
end Is_Function_Attribute_Name; end Is_Function_Attribute_Name;
---------------------------- ----------------------------
-- Is_Locking_Policy_Name -- -- Is_Locking_Policy_Name --
---------------------------- ----------------------------
function Is_Locking_Policy_Name (N : Name_Id) return Boolean is function Is_Locking_Policy_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Locking_Policy_Name .. Last_Locking_Policy_Name; return N in First_Locking_Policy_Name .. Last_Locking_Policy_Name;
end Is_Locking_Policy_Name; end Is_Locking_Policy_Name;
----------------------------- -----------------------------
-- Is_Operator_Symbol_Name -- -- Is_Operator_Symbol_Name --
----------------------------- -----------------------------
function Is_Operator_Symbol_Name (N : Name_Id) return Boolean is function Is_Operator_Symbol_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Operator_Name .. Last_Operator_Name; return N in First_Operator_Name .. Last_Operator_Name;
end Is_Operator_Symbol_Name; end Is_Operator_Symbol_Name;
-------------------- --------------------
-- Is_Pragma_Name -- -- Is_Pragma_Name --
-------------------- --------------------
function Is_Pragma_Name (N : Name_Id) return Boolean is function Is_Pragma_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Pragma_Name .. Last_Pragma_Name return N in First_Pragma_Name .. Last_Pragma_Name
or else N = Name_AST_Entry or else N = Name_AST_Entry
or else N = Name_Storage_Size or else N = Name_Storage_Size
or else N = Name_Storage_Unit; or else N = Name_Storage_Unit;
end Is_Pragma_Name; end Is_Pragma_Name;
--------------------------------- ---------------------------------
-- Is_Procedure_Attribute_Name -- -- Is_Procedure_Attribute_Name --
--------------------------------- ---------------------------------
function Is_Procedure_Attribute_Name (N : Name_Id) return Boolean is function Is_Procedure_Attribute_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Procedure_Attribute .. Last_Procedure_Attribute; return N in First_Procedure_Attribute .. Last_Procedure_Attribute;
end Is_Procedure_Attribute_Name; end Is_Procedure_Attribute_Name;
---------------------------- ----------------------------
-- Is_Queuing_Policy_Name -- -- Is_Queuing_Policy_Name --
---------------------------- ----------------------------
function Is_Queuing_Policy_Name (N : Name_Id) return Boolean is function Is_Queuing_Policy_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Queuing_Policy_Name .. Last_Queuing_Policy_Name; return N in First_Queuing_Policy_Name .. Last_Queuing_Policy_Name;
end Is_Queuing_Policy_Name; end Is_Queuing_Policy_Name;
------------------------------------- -------------------------------------
-- Is_Task_Dispatching_Policy_Name -- -- Is_Task_Dispatching_Policy_Name --
------------------------------------- -------------------------------------
function Is_Task_Dispatching_Policy_Name (N : Name_Id) return Boolean is function Is_Task_Dispatching_Policy_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Task_Dispatching_Policy_Name .. return N in First_Task_Dispatching_Policy_Name ..
Last_Task_Dispatching_Policy_Name; Last_Task_Dispatching_Policy_Name;
end Is_Task_Dispatching_Policy_Name; end Is_Task_Dispatching_Policy_Name;
---------------------------- ----------------------------
-- Is_Type_Attribute_Name -- -- Is_Type_Attribute_Name --
---------------------------- ----------------------------
function Is_Type_Attribute_Name (N : Name_Id) return Boolean is function Is_Type_Attribute_Name (N : Name_Id) return Boolean is
begin begin
return N in First_Type_Attribute_Name .. Last_Type_Attribute_Name; return N in First_Type_Attribute_Name .. Last_Type_Attribute_Name;
end Is_Type_Attribute_Name; end Is_Type_Attribute_Name;
---------------------------------- ----------------------------------
-- Record_Convention_Identifier -- -- Record_Convention_Identifier --
---------------------------------- ----------------------------------
procedure Record_Convention_Identifier procedure Record_Convention_Identifier
(Id : Name_Id; (Id : Name_Id;
Convention : Convention_Id) Convention : Convention_Id)
is is
begin begin
Convention_Identifiers.Append ((Id, Convention)); Convention_Identifiers.Append ((Id, Convention));
end Record_Convention_Identifier; end Record_Convention_Identifier;
end Snames; end Snames;
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment